use*_*968 9 c pointers linked-list data-structures
如何删除单链接列表中的节点,只有一个指针指向要删除的节点?
[开始和结束指针未知,可用信息是指向应删除的节点的指针]
not*_*oop 17
您可以删除节点而不获取上一个节点,方法是让它模仿以下节点并删除该节点:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您需要专门处理最后一个元素.我使用的是一种特殊的节点作为前哨淋巴结,以纪念它具有结局content和next是NULL.
更新:这些行Node *next = n->next; n->next = n->next->next基本上是对节点内容进行洗牌,并释放节点:您在以下位置获取对节点B的引用的图像:
A / To be deleted
next ---> B
next ---> C
next ---> *sentinel*
Run Code Online (Sandbox Code Playgroud)
第一步是n->content = n->next->content:将以下节点的内容复制到要"删除"的节点:
A / To be deleted
next ---> C
next ---> C
next ---> *sentinel*
Run Code Online (Sandbox Code Playgroud)
然后,修改next点数:
A / To be deleted
next ---> C /----------------
next ---| C |
next ---> *sentinel*
Run Code Online (Sandbox Code Playgroud)
实际上释放了以下元素,进入最后的案例:
A / To be deleted
next ---> C
next ---> *sentinel*
Run Code Online (Sandbox Code Playgroud)