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

请查看该网站是如何工作的,这里的主题有哪些问题,以及相应的问题。另请参见:我认为如果您将列表推到堆栈上,然后从堆栈的开头创建一个新列表,或者清除旧列表,它也会反转列表。可能不节省空间,但易于编码和维护。