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

本文讲述了如何正确处理链表中的移除元素问题,包括基本思路、错误修正,以及迭代法和递归法反转链表的方法。还提到了设计链表的挑战,特别是调试和优化问题。
摘要由CSDN通过智能技术生成

203.移除链表元素

题目链接: 203.移除链表元素
参考文档:代码随想录
状态:已完成,耗时一小时

思路:很基础的移除链表元素的题目。当target在头节点时,将头节点指针往后移即可;当target在头节点之后的元素时,则将当前元素的next指向next.next即可。为了统一以上两种操作,可以创建一个头节点插在链表最前面,这样的话,原链表所有元素都在新建头节点之后了。

错误写法:

var removeElements = function(head, val) {
    const ret = new ListNode(0, head);
    let current = ret;
    while(current.next){
        if(val === current.next.val){
            current.next = current.next.next;
        }
        current = current.next;
    }
    return ret.next;
};

这种写法存在一个问题:如果链表最后的节点的val等于target,本次循环执行到最后,current会等于null。这样进行下次循环。

正确解法:

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

在if循环中加continue,当链表最后一个元素的val等于target时,便把该元素删除,此时,current.next === null,下次判断while循环时便会停止循环。

不过我觉得leetcode上官方解法更好理解些:

var removeElements = function(head, val) {
    const ret = new ListNode(0, head);
    let current = ret;
    while(current.next){
        if(val === current.next.val){
            current.next = current.next.next;
        }
        else{
        current = current.next;]
    }
    return ret.next;
};

这里的思路是:如果current.next等于target,则先删除current.next节点;如果current.next不等于target,则将指针往后移。

206.反转链表

题目链接: 206.反转链表
参考文档:代码随想录
状态:已完成,耗时两小时,

思路1:使用迭代法,代码如下:

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

思路2:使用递归法,代码如下:

var reverseList = function(head) {
    if(head === null || head.next === null){
        return head;
    }
    let ret = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return ret; 
};

贴上递归法的参考文章链接:https://leetcode.cn/problems/reverse-linked-list/solutions/99711/fan-zhuan-lian-biao-shuang-zhi-zhen-di-gui-yao-mo-/

707.设计链表

题目链接: 707.设计链表
参考文档:代码随想录
状态:未完成,后续会补上
原因:每个函数都不好debug,很难把握问题出在哪,以及如何写更好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值