繁体   English   中英

当我更改链表中的指针时,原始指针是否仍然保留或自动删除?

[英]When I change pointers in linked list, does the original still hold or does it get removed automatically?

我有一个关于链表的非常基本的问题

假设我反转了以下链表:

#1->2->3->4变成4->3->2->1

假设我首先将指针从 1 反转到 2; 所以 2 指向 1。我的问题是,当我这样做时,从 1 到 2 的指针/连接是否仍然存在?

或者当我们做 2->1 时这个连接会被移除吗?

如果上述情况属实,另一个问题是“无论我们对指针做什么,原始连接 1->2->3->4 是否总是成立;或者它是否被删除,如果说我将指针更改为1 指向 3;即 1->3;那么连接 1->2 会自动删除吗?

通常链表中的一个节点对另一个节点有一个引用:下一个。

当您有一个包含 4 个节点的列表时,您可以像这样对其进行可视化:

 head
  ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next: —————→ │ next: —————→ │ next: —————→ │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

你问:

假设我首先将指针从 1 反转到 2; 所以 2 指向 1。我的问题是,当我这样做时,从 1 到 2 的指针/连接是否仍然存在?

“反转指针”并不是表达所发生事情的正确方式。 从 1 指向 2 的“指针”将设置为None另一个引用将设置为从 2 指向 1。这不是同一个!

所以首先,第一个节点中的next引用是指它之前的节点——但由于没有这样的节点,它会变为None

 head
  ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│   │ next: —————→ │ next: —————→ │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

然后第二个节点也会发生同样的情况。 它的next引用是指第一个节点:

 head
  ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│ ←———— :next  │   │ next: —————→ │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

更多关于典型的反转算法

作为附加步骤,应该使head参考指向现在已经成为已经反转部分的开始:

                head
                 ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│ ←———— :next  │   │ next: —————→ │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

在此反转的每一步中, next被更改的节点与最初跟随它的节点之间存在断开连接(在最后的可视化中,无法再从其上描绘的节点到达值为 3 的节点。左边)。

出于这个原因,您需要有一个变量来记住原始下一个节点是什么,以便您可以继续并更改节点的next属性。 您可以调用该变量next

                head           next
                 ↓              ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│ ←———— :next  │   │ next: —————→ │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

如果我们继续下一步,将执行以下操作:

我们将next ... 的引用复制到一个名为current的变量中:

                               current
                head           next
                 ↓              ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│ ←———— :next  │   │ next: —————→ │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

然后记住原来的下一个节点是什么,通过变量next来引用它:

                head           current        next
                 ↓              ↓              ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│ ←———— :next  │   │ next: —————→ │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

然后将引用从 3 更改为 4,将引用从 3 更改为 2:

                head           current        next
                 ↓              ↓              ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│ ←———— :next  │ ←———— :next  │   │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

请注意,现在最右边的节点已分离。 我们仍然需要更新head引用:

                               head
                               current        next
                                ↓              ↓
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ data: 1  │   │ data: 2  │   │ data: 3  │   │ data: 4  │
│ next:None│ ←———— :next  │ ←———— :next  │   │ next:None│
└──────────┘   └──────────┘   └──────────┘   └──────────┘

现在只剩下一个周期,它从设置current参考开始......等等。

另请参阅此递归 function 如何反转链表?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM