假设有单链表,且其节点定义如下:
struct Node{
Node* next;
int val;
};
如果要删除该单链表中所有值为val的节点,通常会定义一个prev指针来保存被删除节点的前一节点的信息。
代码如下:
Node* del_node(Node* head, int val){
Node* prev = NULL;
Node* trav = head;
while(NULL != trav){
if(trav->val == val){
Node* del = trav;
if(NULL != prev)
prev->next = trav->next;
else
head = trav->next;
trav = trav->next;
delete del;
}
else{
prev = trav;
trav = trav->next;
}
}
return head;
}
利用二级指针,则可以将代码缩减为:
Node* del_node(Node* head, int val){
Node** pp=&head;
for(; *pp ; ){
Node* p=*pp;
if(p->val == val){
*pp = p->next;
delete p;
}else
pp = &p->next;
}
return head;
}
我们可以通过增加一个中间变量来理解这段代码:
Node* del_node(Node* head, int val){
Node* prev;
Node** pp;
prev = head;
pp = &prev; //pp=&head;
for(; prev; ){
Node* p=prev;
if(p->val == val){
prev = p->next;
delete p; // *pp=p->next
}else{
prev = p->next;
pp = &prev; // pp=&p->next;
}
}
return head;
}
可见只是利用二级指针的特性,减少了中间变量prev的使用,从而达到缩减代码的目的。