public void Add(Node<T> newItem)
{
if(this.First==null)
{
this.First = newItem;
this.Last = newItem;
}
else
{
newItem.next = this.First;
this.First = newItem;
}
Count++;
}
我不明白 else
block 实际上是如何工作的。我知道 newItem.next
指向 First
节点,然后在下一行我们将 newItem
分配给 First
.但是我发现很难看出这种操作是如何工作的,以及在以前已经存在节点的情况下如何添加新节点。
最佳答案
将其可视化可能会有所帮助。假设我们已经有一个包含两个节点的列表,其值为 2 和 3:
this
│
▼
┌──────────┐
│ First: ──────────────┐
└──────────┘ ▼
┌──────────┐ ┌──────────┐
│ data: 2 │ │ data: 3 │
│ next: ─────► │ next:null│
└──────────┘ └──────────┘
现在 newItem
已创建,值为 1:
this
│
▼
┌──────────┐
│ First: ──────────────┐
└──────────┘ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ data: 1 │ │ data: 2 │ │ data: 3 │
│ next:null│ │ next: ─────► │ next:null│
└──────────┘ └──────────┘ └──────────┘
▲
│
newItem
请注意,在此阶段,此 newItem
不是链表链的一部分。这就是对 Add(newItem)
的调用将建立的内容。当该方法执行时,我们进入 else
block 并执行 newItem.next = this.First;
,这会修改 this 的 next
属性newItem
对象,因此它引用与 this.First
引用相同的对象。所以我们得到这个:
this
│
▼
┌──────────┐
│ First: ──────────────┐
└──────────┘ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ data: 1 │ │ data: 2 │ │ data: 3 │
│ next: ─────► │ next: ─────► │ next:null│
└──────────┘ └──────────┘ └──────────┘
▲
│
newItem
虽然节点现在指的是链表中的一个节点,但它本身仍然不是链表本身的一部分。为此,我们需要 else
block 中的第二条语句:this.First = newItem;
结果是:
this
│
▼
┌──────────┐
│ First: ────┐
└──────────┘ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ data: 1 │ │ data: 2 │ │ data: 3 │
│ next: ─────► │ next: ─────► │ next:null│
└──────────┘ └──────────┘ └──────────┘
▲
│
newItem
现在目标达到了。该列表现在以值 1 开始,然后是 2,然后是 3。
关于c# - 节点如何添加到链表中并成为它的新头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72675939/