如何反转链表 - 详细说明

How to reverse a linked list - detailed explanation

任何人都可以分享一个 link 到解释如何反转 linked list? 的代码,或者有人可以解释下面的代码片段吗?

我试过 draw/write 它,但仍然不明白节点是如何反转的。

public void reverseList() {
   Node reversedPart = null;
   Node current = head;
   while (current != null) {
       Node next = current.next;
       current.next = reversedPart;
       reversedPart = current;
       current = next;
   }
   head = reversedPart;
}

首先,应避免在 while 循环内使用 Node next 以消除任何类型的混淆。您最好将 next 重命名为 nodeNext,并在 while 循环外声明 Node nodeNext,并使用 nodeNext = current.next; 来解决任何混淆。我认为那是你困惑的根源。

这段代码的作用是反转每个节点的链接方向。

每个节点的下一个节点方向正在反转。第一个节点指向第二个节点(原来是第一个节点前面的节点)的指向是相反的,第一个节点指向它的前任节点,它前面的节点指向第一个节点。

这一直重复到最后一个节点,即current!=null。之后,一旦current变为null,循环不再继续迭代,所有的元素都被反转了。

让我们来看一个简单的例子:

1 > 2 > 3 > 4 > 5 > null - our list

Before the while loop: node = 1, head = null

While moving over the list:

1:                 1 > null; node = 1, head = null, node.next = head, head = node

2:             2 > 1 > null; node = 2, head = 1,    node.next = head, head = node

3:         3 > 2 > 1 > null; node = 3, head = 2,    node.next = head, head = node

4:     4 > 3 > 2 > 1 > null; node = 4, head = 3,    node.next = head, head = node

5: 5 > 4 > 3 > 2 > 1 > null; node = 5, head = 4,    node.next = head, head = node

评论代表算法的第一步:

public Node reverseList(Node head) {
    Node focusNode = head;          // focusNode = 1
    head = null;
    while (focusNode != null) {
      Node parent = focusNode;      // parent = 1
      focusNode = focusNode.next;   // focusNode = 2; moving over the list...
      parent.next = head;           // parent.next = null (1 -> null)
      head = parent;                // head = 1
    }
    return head;
}