out 在while 循环的第一次迭代中发生突变。
这可能有助于将其可视化。
就在循环开始之前,我们创建了一个虚拟节点(值为-1)并使用out 和temp 引用它:
l1
↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
│ next: ────────> │ next: ────────> │ next: None │
out └────────────┘ └────────────┘ └────────────┘
↓
┌────────────┐
│ data: -1 │
│ next: None │
└────────────┘
↑
temp ┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 3 │ │ data: 4 │
│ next: ────────> │ next: ────────> │ next: None │
└────────────┘ └────────────┘ └────────────┘
↑
l2
在第一次迭代中,我们进入else 块,其中temp 被变异。由于temp 和out 引用同一个对象,因此out 会发生变异。
l1
↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
│ next: ────────> │ next: ────────> │ next: None │
out └────────────┘ └────────────┘ └────────────┘
↓
┌────────────┐
│ data: -1 │
│ next: ──────┐
└────────────┘│
↑ │
temp │ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ │ data: 1 │ │ data: 3 │ │ data: 4 │
└> │ next: ────────> │ next: ────────> │ next: None │
└────────────┘ └────────────┘ └────────────┘
↑
l2
此次更新后,l2 和 temp 都被“移动”为指代它们的继任者。这结束了第一次迭代:
l1
↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
│ next: ────────> │ next: ────────> │ next: None │
out └────────────┘ └────────────┘ └────────────┘
↓
┌────────────┐
│ data: -1 │
│ next: ──────┐
└────────────┘│
│
│ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ │ data: 1 │ │ data: 3 │ │ data: 4 │
└> │ next: ────────> │ next: ────────> │ next: None │
└────────────┘ └────────────┘ └────────────┘
↑ ↑
temp l2
我们实际上不必继续执行算法,因为从现在开始out 将不会再次变异:这项工作已经完成。但是让我们继续进行一次迭代(第二次迭代)。我们进入if 块,temp 再次发生变异(但这一次,它不是out 的同义词):
l1
↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
┌> │ next: ────────> │ next: ────────> │ next: None │
out │ └────────────┘ └────────────┘ └────────────┘
↓ └────────────────┐
┌────────────┐ │
│ data: -1 │ │
│ next: ──────┐ │
└────────────┘│ │
│ │
│ ┌────────────┐│ ┌────────────┐ ┌────────────┐
│ │ data: 1 ││ │ data: 3 │ │ data: 4 │
└> │ next: ──────┘ │ next: ────────> │ next: None │
└────────────┘ └────────────┘ └────────────┘
↑ ↑
temp l2
...l1 和 temp 都转移到他们的继任者:
temp l1
↓ ↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
┌> │ next: ────────> │ next: ────────> │ next: None │
out │ └────────────┘ └────────────┘ └────────────┘
↓ └────────────────┐
┌────────────┐ │
│ data: -1 │ │
│ next: ──────┐ │
└────────────┘│ │
│ │
│ ┌────────────┐│ ┌────────────┐ ┌────────────┐
│ │ data: 1 ││ │ data: 3 │ │ data: 4 │
└> │ next: ──────┘ │ next: ────────> │ next: None │
└────────────┘ └────────────┘ └────────────┘
↑
l2
这样继续下去,temp 将保持在连接的结果列表的尾部。在最后一次迭代之后,我们将得到这个:
l1
↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
┌> │ next: ────────> │ next: ──────┐ │ next: None │
out │ └────────────┘ └────────────┘│ └────────────┘
↓ └────────────────┐ ┌───────────────┘
┌────────────┐ │ │
│ data: -1 │ │ │
│ next: ──────┐ │ │
└────────────┘│ │ │
│ │ │
│ ┌────────────┐│ │ ┌────────────┐ ┌────────────┐
│ │ data: 1 ││ │ │ data: 3 │ │ data: 4 │
└> │ next: ──────┘ └>│ next: ────────> │ next: None │
└────────────┘ └────────────┘ └────────────┘
↑
temp
这项工作还没有完全完成,因为您发布的 sn-p 中缺少一些代码。当while 循环退出时,l1 或l2 之一将不是None,这表示仍需要附加到结果列表的部分。由于temp 指的是结果列表的当前尾部,我们应该将其next 引用设置为l1 或l2——以不是None 为准。
所以代码在循环之后应该有如下语句:
temp.next = l1 or l2
...导致:
l1
↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
┌> │ next: ────────> │ next: ──────┐ ┌>│ next: None │
out │ └────────────┘ └────────────┘│ │ └────────────┘
↓ └────────────────┐ ┌───────────────┘ └───────────────┐
┌────────────┐ │ │ │
│ data: -1 │ │ │ │
│ next: ──────┐ │ │ │
└────────────┘│ │ │ │
│ │ │ │
│ ┌────────────┐│ │ ┌────────────┐ ┌────────────┐│
│ │ data: 1 ││ │ │ data: 3 │ │ data: 4 ││
└> │ next: ──────┘ └>│ next: ────────> │ next: ──────┘
└────────────┘ └────────────┘ └────────────┘
↑
temp
最后,函数应该返回结果。由于out 指的是一个虚拟节点,我们不应该只返回out,而应该返回out.next:
return out.next
返回的列表引用将是这个:
┌────────────┐ ┌────────────┐ ┌────────────┐
│ data: 1 │ │ data: 2 │ │ data: 4 │
┌> │ next: ────────> │ next: ──────┐ ┌>│ next: None │
│ └────────────┘ └────────────┘│ │ └────────────┘
└────────────────┐ ┌───────────────┘ └───────────────┐
│ │ │
┌────────────┐│ │ ┌────────────┐ ┌────────────┐│
│ data: 1 ││ │ │ data: 3 │ │ data: 4 ││
returned → │ next: ──────┘ └>│ next: ────────> │ next: ──────┘
└────────────┘ └────────────┘ └────────────┘
我希望这可以澄清它。