这是一个我做错了的编程问题,下面给出了部分代码:
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
但是,我什至没有得到答案,我是一个初学者,如果有人可以解释这个问题,我将不胜感激。
您的老师提供的代码不完整。无论如何,我可以给您两种方法来找到下半部分的指针:
如果要让指针引用同一列表的后半部分。
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;
}
如果要创建一个包含下半部分所有节点的新列表,则可以执行以下操作:首先找到中间节点,然后通过创建从中间节点迭代到下一个节点的新节点,从下半部分创建一个新列表。列表的末尾。
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句