void DelNode(Node head,int num)
{
Node h = head->next;
Node prev = head;
for (;h->next;) {
printf("prev=%p curr=%p\n",prev->next,h->next);
if (h->num == num) {
prev->next = h->next;
free(h);
break;
}
h=h->next;
prev=prev->next;
}
return ;
}
上面的方法是学校里交授的方法,即需要始终保存当前节点的前一个节点,因为删除操作时,你需要前一个节点的next域。但是,Linus认为这样做是不理解指针的做法。
如果开发者能够理解指针,只需要使用“指向该条目的指针”并初始化list_head,然后贯穿列表,此时无需使用任何条件语句即可删除该条目。即使用二级指针。
void DelNode1(Node* head,int num)
{
Node *curr = head;
for(;*curr;) {
Node rmp = *curr;
printf("curr=%p *curr=%p rmp=%p num=%d\n",curr,*curr,rmp,rmp->num);
if (rmp->num == num) {
*curr = rmp->next;
free(rmp);
break;
}
curr=&rmp->next;//二级指针,curr存储的是指向下一个节点的地址,即上一个节点地址
}
return ;
}