leetcode刷题第三天(一)

203.移除链表元素

题意
删除链表中等于给定值 val 的所有节点。

示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

示例 2:
输入:head = [], val = 1 输出:[]

示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]

思路:首先确定需要多少个额外的指针才能进行删除操作。肯定要有一个cur指针不断进行节点遍历判断节点的val值是否与目标值相同,其次考虑当要删除的节点是第一个节点时的情况,此时直接进行head = head->next操作即可,如果时这样的话我们需要额外判断要删除的节点是否为第一个节点,因为正常来说如果要删除的节点在中间的话,执行的操作应该是cur->next = cur->next->next(将待删除节点的下一个节点的地址赋值给指向待删除节点的指针),两种操作不一样,为了统一,我们可以再设置一个虚拟节点指向头指针head,使得head也变成一个中间节点,能够进行统一处理。

解法:javascript

var removeElements = function(head, val) {
    const dHead = new ListNode(0, head);
    let cur = dHead;
    while(cur.next) {
        if(cur.next.val === val) {
            cur.next =  cur.next.next;
            continue;
        }
        cur = cur.next;
    }
    dHeadurn dHead.next;
};

代码执行示意图:现在假设val = 6

  • 当删除的节点在第一个:
    在这里插入图片描述

  • 当删除的节点在中间:

在这里插入图片描述

提问:

1. let cur =dHead这个操作做了什么事?

首先要理解dHead是什么,dHead是一个指向了一个ListNode类型的节点(虚拟头节点)的指针,dHead里面存放的是这个节点的地址。将dHead的值赋给cur,此时cur也指向了这个虚拟头节点,拥有了能够从头开始操作该链表的能力。dHead存在的意义是为了保存该链表的初始地址,而cur是为了能够遍历链表进行删除节点的操作。

2. while(cur.next)中为什么判断的是cur.next?可不可以直接判断cur?

不可以。cur一开始就是指向虚拟节点的,而我们要判断的是从虚拟节点后开始的真正的节点,从cur->next开始才是真正的节点。

3. 为什么最后返回的是dHead.next而不是head?

看示意图中的第一种情况,head指针会因为删除了真正的头结点而丢失,所以应该借助dHead->next 来获取链表真正的初始位置。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值