c# - 节点如何添加到链表中并成为它的新头?

标签 c# data-structures linked-list

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/

相关文章:

c# - 为什么委托(delegate)在静态方法中使用时不能引用非静态方法?

c# - 列出项目到数据库

python - 添加计数器删除键

c# - 图数据结构 C# 的问题

java - 为什么此 PrintWriter 不填充此文件?

c++ - 交换单链表节点创建一个无限循环

c# - 关于 C# 4.0 泛型协变的问题

c# - GetWindowLong(int hWnd, GWL_STYLE) 在 c# 中返回奇怪的数字

java维护 map 中的插入顺序

Java 手动将数组转换为节点列表