【发布时间】:2010-12-29 22:54:34
【问题描述】:
如何删除单链表中只有一个指针指向待删除节点的节点?
[开始和结束指针未知,可用信息是指向应该删除的节点的指针]
【问题讨论】:
标签: c data-structures pointers linked-list
如何删除单链表中只有一个指针指向待删除节点的节点?
[开始和结束指针未知,可用信息是指向应该删除的节点的指针]
【问题讨论】:
标签: c data-structures pointers linked-list
您可以在不获取前一个节点的情况下删除一个节点,方法是让它模仿以下节点并删除那个节点:
void delete(Node *n) {
if (!is_sentinel(n->next)) {
n->content = n->next->content;
Node *next = n->next;
n->next = n->next->next;
free(next);
} else {
n->content = NULL;
free(n->next);
n->next = NULL;
}
}
如您所见,您需要专门处理最后一个元素。我正在使用一个特殊节点作为哨兵节点来标记具有content 和next 的结尾是NULL。
更新:Node *next = n->next; n->next = n->next->next 行基本上会打乱节点内容,并释放节点:您获得要删除的节点 B 引用的图像:
A / To be deleted
next ---> B
next ---> C
next ---> *sentinel*
第一步n->content = n->next->content:将以下节点的内容复制到要“删除”的节点:
A / To be deleted
next ---> C
next ---> C
next ---> *sentinel*
然后,修改next点:
A / To be deleted
next ---> C /----------------
next ---| C |
next ---> *sentinel*
实际上释放了以下元素,进入最后的情况:
A / To be deleted
next ---> C
next ---> *sentinel*
【讨论】:
不可能。
有模仿删除的技巧。
但是这些都不会真正删除指针指向的节点。
删除跟随节点并将其内容复制到要删除的实际节点的流行解决方案如果您有外部指针 指向链表中的节点,在这种情况下,指向下一个节点的外部指针会悬空。
您可以在 SO here 上找到一些讨论。
【讨论】:
在这种限制下,唯一明智和安全的选项是将节点标记为已删除而不实际取消链接,将其推迟到以后。
【讨论】: