前言
当你尝试删除链表中的一个节点时,如果你直接使用 p = p->next; 这样的语句,你会遇到问题,特别是当你要删除的不是链表的头节点时。这是因为在链表中,每个节点都包含数据和指向下一个节点的指针。当你删除一个节点时,你需要确保前一个节点的 next 指针指向被删除节点的下一个节点,从而保持链表的连续性。
如果你直接将 p 指向 p->next,你会遇到以下问题:
- 失去对下一个节点的引用:当你执行 p = p->next; 后,原来的 p 节点(你想要删除的节点)将被覆盖,你将失去对下一个节点的引用。这意味着你无法更新前一个节点的 next 指针,从而导致链表断裂。
- 无法更新前一个节点的 next 指针:在删除节点时,你需要将前一个节点的 next 指针指向被删除节点的下一个节点。如果你直接移动 p 指针,你将无法访问前一个节点来更新它的 next 指针。
例如,假设你有如下链表:
A -> B -> C -> D
如果你想删除节点 B,你需要执行以下步骤:
- 保存节点 C 的引用(因为删除 B 后,你将失去对 C 的引用)。
- 将节点 A 的 next 指针指向节点 C。
- 删除节点 B。
如果你直接使用 p = p->next;,你将无法完成第2步,因为你失去了对节点 C 的引用。
正确的步骤是:
ListNode* temp = p->next; // 保存节点C的引用
p->next = temp->next; // 将节点A的next指针指向节点C
delete temp; // 删除节点B
这样,你就可以确保链表的连续性,并且正确地删除节点。这就是为什么你不能简单地使用 p = p->next; 来删除链表中的节点。