Linus的二级指针思想

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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值