通过二级指针插入节点

这是在编程珠玑的习题上看到的,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);
	else
		before->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张图片

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


你可能感兴趣的:(通过二级指针插入节点)