【Leetcode】Two Star Programming

Leetcode 203

Two Star Programming方法使用双重指针对链表中的一些节点进行删除

代码:

struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode **temp = &head;
    while (*temp){
        if ((*temp)->val == val)
            *temp = (*temp)->next;
        else
            temp = &(*temp)->next;
    }
    return head;
}

这种方法的代码非常简洁,但是可能理解起来有些困难,因此下面举一个例子来逐步分析代码

假设链表长度为4,四个节点分别存储了1,1,6,1的数据,现在需要将其中val为1的节点删除
链表及temp和head变量的初始状态如图所示,其中方框内为每个变量对应的值,方框左边每个变量对应的内存地址
在这里插入图片描述
假设temp变量的地址为20,其指向的是head变量的地址,即为80,而head变量指向的为第一个节点的开始地址,即为100

第一次迭代:

此时 *temp 即为head,head->val即为地址100处的结构体(绿色)的val值,为1,与进行判断的val(1)相等,因此该节点需要删除,此时执行*temp=(*temp)->next语句,(*temp)->next为108,即将*temp改为108,也就是head=108

修改后的状态如下图:
在这里插入图片描述

第二次迭代:
此时*temp为108,非空
(*temp)->val即为地址108处结构体(黄色)的val值,仍然为1,继续需要删除
再次执行*temp=(*temp)->next语句,此时(*temp)->next为116,因此将*temp改为116,也就是head=116
修改后的状态如下图:

在这里插入图片描述

第三次迭代:
此时*temp为为116
(*temp)->val即为地址116处结构体(蓝色)的val值,为6,不需要删除
此时执行temp = &(*temp)->next语句,(*temp)->next 为蓝色结构体中的next域,其地址为120,因此此步语句将temp修改为120
修改后的状态如下图:

在这里插入图片描述

第四次迭代:
此时*temp即为地址120处的值,即为124,非空
(*temp)->val即为地址124处结构体(红色)的val值,为1,需要删除
执行*temp=(*temp)->next语句,(*temp)->next为红色结构体的next域,即为0,因此*temp修改为0,也就是地址120处的值修改为0
修改后的状态如下图:

在这里插入图片描述

此时*temp即为地址120处的值为0,循环结束

可以看到整个循环结束后,head指向116,即为蓝色结构体,而其next域为0,因此将其他三个val为1的节点成功删除

参考链接:http://wordaligned.org/articles/two-star-programming

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值