通过二级指针插入节点

来源:互联网 发布:win10默认网卡mac地址 编辑:程序博客网 时间:2024/06/07 17:49

这是在编程珠玑的习题上看到的,P214第四题

节点的定义如下:

struct node{int val;node *next;node(int v,node *p){val=v; next=p;}};
另外初始化的过程中,初始化头结点,head=new node(maxval,0)其中maxval表示一个最大值

通常的插入函数都会这样来写:

void insert(int t){node* before=NULL;node* p=head;while(p->val<t){before=p;p=p->next;}if(p->val==t)return;if(before==NULL)head=new node(t,head);elsebefore->next=new node(t,p);}
但是,上述过程会分情况(在链表最前面插入节点和在链表中插入节点)来讨论

下面就让我们来看一下二级指针的威力:

void insert(int t){Node **p=&head;for(;(*p)->val<t;p=&((*p)->next));if((*p)->val==t)return;*p=new node(t,*p);}
最关键的一句就是*p=new node(t,*p),首先明确*p指的是第一个比t大的元素,这个过程分为以下步骤:

1)new node(t,*p):新建了一个节点,元素为t,下一个元素为比它大的元素*p

2)将新节点的地址赋值给*p

我通过图片讲解一下这个过程:


目标是向链表1,5中插入元素3,这时*p的位置在5这个元素上,步骤1)很好理解,关键是步骤2),当我们修改了*p的时候,有一点特别重要的是1的next存的是5的地址也就是*p并且*p存在变量p中,*p改变后1指向的元素也会随之改变,p中放的元素相当于是3的地址,这样就将1-3连在了一起。


原创粉丝点击