二级指针删除链表元素

利用二级指针删除链表内一个元素,传统的做法是:找到将要删除元素的前一个指针,然后再删除当前元素。代码示例:

void
delete_node( elem_type
x, struct
node* l )
{
????struct
node* p = find_prev ( x, l );

????if ( !p->next ) {
????????printf ( "element %d not in the struct node*\n", x );
????????return;
????}

????struct
node* tmp = p->next;
????p->next = p->next->next;

????free ( tmp );
}

而通过二级指针的方法,则不需要如此。

void
delete_version_2 ( struct
node** head, elem_type
x )
{
????for ( struct
node** curr = head; *curr; ) {
????????struct
node* entry = *curr;
????????if ( entry->elem == x ) {
????????????*curr = entry->next;
????????????free ( entry );
????????} else {
????????????curr = &entry->next;
????????}
????}
}

二级指针删除链表元素

时间: 2024-08-11 22:57:10

二级指针删除链表元素的相关文章

【转】Linus:利用二级指针删除单向链表

原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多,并加入了插图) Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level coding. 下面是Linus的教学原文及翻译—— “At the opposite en

【LeetCode】28.Linked List— Remove Linked List Elements删除链表元素

Remove all elements from a linked list of integers that have value val. Example: Input: 1->2->6->3->4->5->6, val = 6 Output: 1->2->3->4->5 说到删除,首先想到定义两个指针,分别指向要被删除的结点和该结点的前驱结点.这里还需要考虑头结点是需要删除结点的特殊情况. /** * Definition for sing

LeetCode Remove Linked List Elements 删除链表元素

题意:移除链表中元素值为val的全部元素. 思路:算法复杂度肯定是O(n),那么就在追求更少代码和更少额外操作.我做不出来. 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 1

19. Remove Nth Node From End of List 倒数删除链表元素

思路:第一时间想到的肯定是通过添加计数器解决这个问题,但是问题产生了,链表具有单向性,统计总数,还是计算当前数目都在效率上面很吃亏. 借用快慢指针的思想.可以安排两个同速指针,但是他们存在先后顺序,就可以解决这个问题. public class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if(head == null || n <= 0) return null; ListNode dummy = ne

关于一级指针和二级指针的简单见解

一级指针形式如: int *p二级指针形式如: int **p 可能很多初学者会疑惑在函数参数里面到底应该用一级指针还是二级指针. 下面用几个例子说明一下: 第一个是大家都很熟悉的链表 下面是一个链表结构:   typedef struct Node{ int value; struct Node *next;} 对于添加数据到链表尾部这个函数,传入的参数必须是一个二级指针. 在传参的时候发生的赋值动作是: Node *hNode;Node **pNode = &hNode; pNode指向了h

(C++)函数参数传递中的一级指针和二级指针

(C++)函数参数传递中的一级指针和二级指针 主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针:指向指针的指针,就是地址的地址: 如: int a=1; int *p=&a; // p为a变量的地址,通过*p可以得到a的值 int **q=&p; // q为p指针的地址,通过**q可以得到a的值 2.函数指针传递的例子 程序1: 1 2 3

OpenCV二维Mat数组(二级指针)在CUDA中的使用

CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二维数组,这样能够省去很多参数,在核函数中可以使用二维数组那样去取数据简化代码结构.当然使用二维数据会增加GPU内存的访问次数,不可避免会影响效率,这个不是今天讨论的重点了. 举两个代码栗子来说明二维数组在CUDA中的使用(亲测可用): 1. 普通二维数组示例: 输入:二维数组A(8行4列) 输出:二

彻底理解链表中为何使用二级指针或者一级指针的引用

 彻底理解链表中为何使用二级指针或者一级指针的引用 http://blog.csdn.net/u012434102/article/details/44886339 struct _node  {  void*data;  struct_node *prior;  struct_node *next;  } typedef_node Node;   //给这个_node结构体定义一个别名,任何使用_node的地方都可以用Node来替换 typedef_node* PNode;   //给这个指向

链表:二级指针的使用

博文的记录源自阅读著名的酷壳主页:http://coolshell.cn/articles/8990.html Coolshell图文并茂说明了这个问题——我们在删除链表的时候,常常需要记录该结点在链表中是否有前趋prev.如果有,那么需要把prev->next指向该结点的next域,然后再删除该结点,这样才能保证链表不会因为删除结点而“断开”.像这样: void remove(list_node **ref_head, list_node *del) { if ((*ref_head) ==