刷题系列之203.移除链表元素

58 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

题目来源

leetcode.cn/problems/re…

题目介绍

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

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

题目分析

这里我们首先需要知道什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链接的入口节点称为链表的头结点也就是head

已知一个头节点head,和一个整数val,需要删除节点的val等于整数的节点,因此我们要确认就是要删除对应的节点,就是把这个节点的next往后移动一个位置,即删除了。

就是head.next=head.next.next,这样的意思就是删除了一个节点。

题目解答

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var removeElements = function(head, val) {
 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;
};

这里我们增加了一个头节点,只要cur.next存在,那么就判断val是否相等,如果满足,那么移除这个节点,然后给头节点重新赋值,继续循环,直到不存在next,最终ret.next就是移除满足条件节点后的head头节点。

image.png

官方解答

var removeElements = function(head, val) {
    if (head === null) {
            return head;
        }
        head.next = removeElements(head.next, val);
        return head.val === val ? head.next : head;
};

官方这个利用了递归来处理,很精髓啊,完美诠释了递归的用法,很值得学习,因为递归真的方便,省了好多代码,并且性能也相对前面的while循环更好。 因为我们就是要求移除满足条件的head新节点,因此当head等于null时,说明递归结束,这个head==null实际是head.next==null。 递归的终止条件是 head 为空,此时直接返回 head。当 head 不为空时,递归地进行删除操作,然后判断 head 的节点值是否等于 val 并决定是否要删除 head。

总结

链表相关题目主要就是要掌握递归用法,这是经常需要用到的。