如何反转链表 - 详细说明
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;
}
任何人都可以分享一个 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;
}