✅✅代码随想录算法训练营Day3 | | 203.移除链表元素 ,707.设计链表 , 206.反转链表

114 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第7篇文章 点击查看文章详情 🚀🚀

203. 移除链表元素 - 力扣(LeetCode)

难度:🔥🔥

给你一个链表的头节点 head和一个整数 val请你删除链表中所有满足 
Node.val == val的节点并返回新的头节点 。

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

不设置虚拟头结点

    if(!head) return head;
    //1.该结点为头结点,针对7777的情况所以用while
    while(head!== null && head.val === val) head = head.next;
    //2.该结点不是头结点
    let cur = head;//方便找到要删除结点node的前一个prev,让prev指向node.next
    while(cur && cur.next)//避免对空指针进行操作
    {
        if(cur.next.val === val){
            cur.next = cur.next.next;
        }
        else 
            cur = cur.next;
    }
    return head

设置虚拟头结点

    const ret = new ListNode(0, head);
    let cur = ret;
    while(cur.next) {
        if(cur.next.val === val) {
            cur.next =  cur.next.next;
            continue;
        }
        cur = cur.next;
    }
    return ret.next;

难点

为什么要设置虚拟头结点?

我的理解是,为了更好的对链表进行一个统一的操作

不设置虚拟头结点时,要对链表的头结点进行一个单独的处理

设置了虚拟头结点时,则不需要考虑。

小心对空指针进行操作导致报错

尤其是目标值为链表最后一项时,如果写了两层next,就会因为导致对空指针进行了操作而报错。

返回值问题

什么时候返回head?

什么时候返回其他?

我的理解是,返回其他 => 虚拟头结点的next更加稳妥

因为针对7777 target=7 情况,直接返回head,会导致直接按原链表进行输出

707. 设计链表 - 力扣(LeetCode)

难度:🔥🔥🔥🔥🔥

这道题,我不是被算法卡死了,我是被es6语法卡死了~ 😡😡

暂时先搁置一旁吧,害~

206. 反转链表 - 力扣(LeetCode)

难度:🔥🔥

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。


输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

var reverseList = function(head) {
    if(!head) return head;
    let cur = head;
    let pre = null;
    while(cur){
        let next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;

};

难点

这题比较简单,但还是要注意:

pre不要习惯性的设置成结点,它仅仅只是链表中的一个位置

设成结点的话会直接改变结点的长度

收获

先谈谈自己的不足吧

第一题和第三题都是前不久才刚刷过的题,结果第一遍还是不能拿下~

菜是真的菜呀。。。。

第一题

  1. 一不小心就对空指针进行了操作,导致控制台报错
  2. 返回的值还不是很清楚

第二题

设计链表

都怪es6基础不太好,愣是看不懂class类里面的this~

第三题

我直接给pre设置成结点了

会被自己蠢哭~

好在又对这些题目加深了一些自己的理解。

也算是有不少的收获

待明日的太阳升起,又是元气满满的一天~

⭐⭐⭐