[Happy DSA] 删除单链表中任意一个节点的方法
2013-11-11 17:37
363 查看
在阅读c-algorithms代码时,又看到如下的代码(删除单链表中任意一个节点)
上面的函数实现不仅可以去除头节点,也可以去除中间的任意节点。它依赖的技巧就是节点指针的指针:用节点指针的指针来保存前面一个节点的next域的指针,从而在去除当前节点之前,可以将当前节点的下一个节点link/assign到那个保存的next指针域中。
我们通常的做法可能会区分对待头节点,并维护一个prev节点指针。
上面的方法巧妙并且通用的解决了上面的问题。
找到一张以前画的示意图(跟上面的代码变量定义有些出入):
/* A singly-linked list */ struct _SListEntry { SListValue data; SListEntry *next; }; int slist_remove_data(SListEntry **list, SListEqualFunc callback, SListValue data) { SListEntry **rover; SListEntry *next; int entries_removed; entries_removed = 0; /* Iterate over the list. 'rover' points at the entrypoint into the * current entry, ie. the list variable for the first entry in the * list, or the "next" field of the preceding entry. */ rover = list; while (*rover != NULL) { /* Should this entry be removed? */ if (callback((*rover)->data, data) != 0) { /* Data found, so remove this entry and free */ next = (*rover)->next; free(*rover); *rover = next; /* Count the number of entries removed */ ++entries_removed; } else { /* Advance to the next entry */ rover = &((*rover)->next); } } return entries_removed; }
上面的函数实现不仅可以去除头节点,也可以去除中间的任意节点。它依赖的技巧就是节点指针的指针:用节点指针的指针来保存前面一个节点的next域的指针,从而在去除当前节点之前,可以将当前节点的下一个节点link/assign到那个保存的next指针域中。
我们通常的做法可能会区分对待头节点,并维护一个prev节点指针。
上面的方法巧妙并且通用的解决了上面的问题。
找到一张以前画的示意图(跟上面的代码变量定义有些出入):
相关文章推荐
- 不带头结点的单链表删除任意一个节点
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- Delete Node in a Linked List 删除链表的一个节点
- 删除单向链表中的某一个节点
- 删除链表节点的二种方法比较
- javascript删除一个html元素节点的方法
- python实现单链表中删除倒数第K个节点的方法
- 【算法之链表(三)】单链表中,在仅允许使用一个指针的情况下,在指定的节点前面插入以及删除一个节点
- 剑指offer——两个链表的第一个公共结点(给出的方法,都是针对有且只有一个公共节点的方法)
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 【链表】删除一个无头单链表的非尾节点 以及从尾到头打印单链表
- 用O(1)时间,删除一个链表节点(3)
- 遍历Linux kernel的链表时删除节点的方法 list_for_each_safe
- 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值
- 编程之美-从无头单链表中删除节点方法整理
- 13:在O(1)时间内删除单向链表中的一个节点
- 单链表头结点未知的情况下删除任意节点
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 一个单向链表,不知道头节点,一个指针指向其中一个节点,问如何删除这个指针指向的节点?
- 21.输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判