解决方法
您可以删除节点而不得到上一个节点,通过使节点模仿以下节点并删除该节点:
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; } }
你可以看到,你需要专门处理最后一个元素.我正在使用一个特殊节点作为哨兵节点来标记具有内容的结尾,接下来是NULL.
UPDATE:行节点* next = n-> next; n→next = n→next-> next接下来基本上洗牌节点内容,并释放节点:Image获取对要删除的节点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*
然后修改下列几点:
A / To be deleted next ---> C /---------------- next ---| C | next ---> *sentinel*
实际上释放了以下元素,得到最终的例子:
A / To be deleted next ---> C next ---> *sentinel*