将链表分成两半并返回后半部分

时间:2016-06-21 03:03:28

标签: java algorithm linked-list

这是一个编程问题,我做错了。有一部分代码给出如下:

List

我的任务是创建一个方法,将链表分成两半,留下原始列表中元素的前半部分,并返回包含列表后半部分的新SingleLinkedList。如果元素数是奇数,那么额外的元素应该与上半部分一起。我不能这样做。然后我的老师给出了如下答案:

public class SingleLinkedList<E> {
   private Node<E> head;
   private int size = 0;

   private static class Node<E> {
     private E data;
     private Node<E> next;

     /** Creates a new node with a null next field
         @param dataItem  The data stored
     */
     private Node(E data) {
       data = dataItem;
       next = null;
     }

    /** Creates a new node that references another node
         @param dataItem  The data stored
         @param nodeRef  The node referenced by new node
     */
     private Node(E dataItem, Node<E> nodeRef) {
       data = dataItem;
       next = nodeRef;
     }
  }

}

然而,我甚至没有得到答案。我是初学者。如果有人能解释这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的教师提供的代码不完整。无论如何,我可以给你两种方法来找到指向下半部分的指针:

  1. 如果您希望指针在同一列表中引用后半部分。

    var server1 = getDataFromServer1()
    var server2 = getDataFromServer2UsingServer1Data(server1);
    var server3 = getDataFromServer3UsingServer2Data(server2);
    
  2. 如果你想创建一个包含下半部分所有节点的新列表,那么你可以执行以下操作。首先我们找到中间节点,然后我们将通过创建新节点从后半部分创建一个新列表节点从中间节点迭代到列表末尾。

    private static Node getSecondHalfInSameList(Node head) {
        Node fastRunner = head, slowRunner = head;
        while(fastRunner != null && fastRunner.next != null) {
            slowRunner = slowRunner.next;
            fastRunner = fastRunner.next.next;
        }
        return slowRunner;
    }