我正在学习考试,我并不太了解链表。我想知道是否有人可以向我解释几行代码。
class Node{
Node next, previous;
final int value;
Node(int v){
value = v;
}
}
public class Linked{
Node start = null, end = null;
// Add a node on the end
void append(int v){
Node n = new Node(v);
if (start == null){
start = end = n;
return;
}
end.next = n;
n.previous = end;
end = n;
}
// Add a node to the front
void prepend(int v){
Node n = new Node(v);
if (start == null){
end = start = n;
return;
}
n.next = start;
start.previous = n;
start = n;
}
}
我需要解释的行是append和prepend方法中的最后3行。注释解释了每种方法的目的,但我不明白在这些代码行中实际做了什么。提前谢谢。
答案 0 :(得分:3)
<强>追加强>
当您希望在列表末尾添加节点时,它应该链接到当前的最后一个节点:
end.next = n; // the current last node points to the new node
n.previous = end; // the new node points back to the previous node
// (which is the current last node)
end = n; // the new node becomes the last node
prepend 类似:
n.next = start; // the node that follows the new node is the current first node
start.previous = n; // the previous node of the current first node is the new node
start = n; // the new node becomes the first node
答案 1 :(得分:0)
类Node显示列表中有一些名为nodes的项。这些项目跟踪当前节点(下一个和上一个)之前和之后的项目。 Linked类为列表的开头和结尾创建一个Node对象,并且有两个方法:append将在当前节点之后添加一个整数v,并且prepend将在当前节点之前向节点添加一个整数。
答案 2 :(得分:0)
您将创建一个位于列表尾部end
之后的新节点。
end.next = n;
同样,由于它是双重关联的,n
现在会有一个上一个节点end
。
n.previous = end;
最后,由于新节点现在是列表的尾部,我们将其分配给end
。
end = n;
Prepend遵循类似的逻辑。前一个头start
将在新节点之后出现。
n.next = start;
由于它是双向链接的,start
需要知道前一个节点是新节点。
start.previous = n;
最后,我们的新节点是新的节目。
start = n;
答案 3 :(得分:0)
想象一下,如果你有一个链条,链条的每个部分(节点)只知道它前面的那个和它背后的那个。
所以,现在我想将新的部分(节点)附加到链的末尾,我们称之为 N 。
A - &gt; B - &gt; C ===&gt; A - &gt; B - &gt; C - &gt; N.
为了正确插入 N ,我需要 N 来了解 C , C 知道 N 就在它面前。所以,现在我将更新c.next
或您的end.next
更新为 N ,n.previous
即将结束。现在我的新结局是 N 而不是 C 。
同样的事情开始。
A - &gt; B ==&gt; N - >; A - &gt;乙 我们会更新 A , N 并开始。