在Java中反转单链表
我正在尝试反转链接列表并返回新的头在Java中反转单链表,java,linked-list,Java,Linked List,我正在尝试反转链接列表并返回新的头 public Node reverse(Node head) { Node node = head; if (node.next == null) { head = node; return head; } Node next = node.next; reverse(next); next.next = node; return head; } 节点类: public
public Node reverse(Node head) {
Node node = head;
if (node.next == null) {
head = node;
return head;
}
Node next = node.next;
reverse(next);
next.next = node;
return head;
}
节点类:
public class Node {
int data;
Node next;
}
通过输入1->2->3->4->5,我得到输出1->2->1->2->1。为什么它循环使用前2个节点,而忽略其余3个节点?另外,为什么新磁头没有更新到节点5?有两个问题:
当到达列表末尾时返回新头时,您不会保存它,因此返回的头始终是递归的第一个堆栈中的一个,即原始的第一个节点;
您没有在第一个节点上将node.next赋值为null,因此它永远不会成为列表的新尾部。
这是正确的代码:
public Node reverse(Node head) {
Node node = head;
if (node.next == null) {
head = node;
return head;
}
Node next = node.next;
// fix for problem 2, we transform the current node in the tail
node.next = null;
// fix for problem 1, head is now the tail node
head = reverse(next);
next.next = node;
return head;
}
请查看该网站是如何工作的,这里的主题有哪些问题,以及相应的问题。另请参见:我认为如果您将列表推到堆栈上,然后从堆栈的开头创建一个新列表,或者清除旧列表,它也会反转列表。可能不节省空间,但易于编码和维护。