我正在学习解决复杂的算法。为此,我遇到了LinkedList的实现。我想了解上述解决方案。在appendToTail中,我不了解while循环和while循环之后的行。在deleteNode中,我无法看到节点的删除位置。
class Node {
Node next = null;
int data;
public Node(int d) {
data = d;
}
void appendToTail(int d) {
Node end = new Node(d);
Node n = this;
while (n.next != null) {
n = n.next;
}
n.next = end;
}
Node deleteNode(Node head, int d) {
Node n = head;
if (n.data == d) {
return head.next; /* moved head */
}
while (n.next != null) {
if (n.next.data == d) {
n.next = n.next.next;
return head; /* head didn’t change */
}
n = n.next;
}
}
}
答案 0 :(得分:3)
这里有两种情况需要考虑:首先,当节点是列表中的第一个时。然后头部移动到下一个节点,第一个节点不再是列表的一部分。
在第二种情况下,我们只是按节点迭代整个列表。如果我们到达其下一个节点需要删除的节点(由if语句检查),则将其更改为在删除的节点之后保存节点作为下一个节点(if语句中的第一行)。这将从列表中删除该节点。这里的头部保持不变,因为更改它会删除应该删除的节点之前的所有元素(如果它被删除后更改为节点)。
当应该删除节点b
时,所有节点a
必须指向b
(c
)之后的节点。列表的外观如下:
... a -> b -> c -> ... // before deletion
... a -> c -> ... // after deletion, now a points to c
有关更好的可视化的解释,您可以查看here。一般情况部分是描述第二种情况的地方。在移植过程中明确进行移除的处理,因为它是由垃圾收集器完成的。
答案 1 :(得分:1)
LinkedLists
有几个实现。有些只保留pointer
到列表的head
。其他人跟踪尾部以完成追尾O(1)
此实现不维护尾部指针,因此您必须从头部
开始遍历列表1 --> 2 --> null
^
head
所以this
指的是列表的头部。 while循环遍历列表直到它到达结尾或(直到n中的下一个节点指针等于null)
在上面的示例中,循环将在此处终止
n n.next
2 null
然后循环退出并设置:
n.next = end
新列表如下所示:
1 --> 2 --> 3
^
head