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

标签 java algorithm linked-list

这是一道我做错的编程题,给出部分代码如下:

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;
     }
  }

}

我的任务是创建一个将链表分成两半的方法,将前半部分元素保留在原始列表中,并返回一个包含列表后半部分的新 SingleLinkedList。如果元素数量为奇数,则额外的元素应该放在前半部分。我做不到。然后我的老师给出了如下答案:

SingleLinkedList<E> newlist = new SingleLinkedList<E>();
 newlist.head =  temp.next; 
temp.next= null; 
return newlist

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

最佳答案

您老师提供的代码不完整。不管怎样,我可以给你两种方法来找到下半部分的指针:

  1. 如果您想要一个指针来引用同一列表中的后半部分。

    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;
    }
    
  2. 如果你想创建一个包含下半部分所有节点的新列表,那么你可以执行以下操作。这里首先我们找到中间节点然后我们将通过创建新的下半部分创建一个新列表从中间节点迭代到列表末尾的节点。

    private static Node getSecondHalfByCreatingNewNodes(Node head) {
        Node mid = getMiddleNode(head);
        Node newHead = new Node(mid.data);
        mid = mid.next;
        Node tail = newHead, temp;
        while(mid != null) {
            temp = new Node(mid.data);
            tail.next = temp;
            tail = temp;
        }
        return newHead;
    }
    
    private static Node getMiddleNode(Node head) {
        Node fastRunner = head, slowRunner = head;
        while(fastRunner != null && fastRunner.next != null) {
            slowRunner = slowRunner.next;
            fastRunner = fastRunner.next.next;
        }
        return slowRunner;
    }
    

关于java - 将链表分成两半并返回后半部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37934889/

相关文章:

java - Java程序如何在虚拟环境中运行Python程序?

java - Recurcison Java 奇怪的行为,打印节点

java - 通过Criteria api转义LIKE中的字符

java - 获取 gdata 服务时出现 NoSuchMethod 错误

java - quartz JDBCJobStore 配置与 mysql

algorithm - 从A点到B点,只能向上和向右移动,有多少种可能的移动方式?

c++ - 随机唯一整数的非标准排序算法

c++ - 通过给定点的最小线数

c - 双链表中的冒泡排序导致尝试从 NULL 读取

java - 我需要一些关于排序节点的解释