【每日算法】力扣203. 移除链表元素 & 83. 删除排序链表中的重复元素

101 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

203. 移除链表元素

描述

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

示例 1:

image.png

输入: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
输出:[]

做题

做了这么多道题,我得出一个结论,做链表的题目不要吝啬创建一个新的链表头,这会大大降低题目的难度,如果一直执着于要用原来的链表头去做题,那会纠结于怎么找到合适的链表头。

思路:

这道题比较简单,遍历链表,如果 Node.val == val 就跳过,需要注意的是,当不等于时,把当前节点连接到我们的新的链表上时,要把这个节点的尾巴给切掉,不然当最后一个数我们也要跳过时,就非常难处理。

public ListNode removeElements(ListNode head, int val) {
        ListNode result = new ListNode(-1);
        ListNode temp = result;
        while(head!=null){
            if(head.val == val){
                head = head.next;
            }else{
                temp.next = head;
                temp = temp.next;
                head = head.next;
                temp.next = null;
            }
        }
        return result.next;
    }

image.png

83. 删除排序链表中的重复元素

描述

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。

返回同样按升序排列的结果链表。

示例 1:

输入: head = [1,1,2]
输出: [1,2]

示例 2:

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

做题

思路:

当我们熟练了链表的套路之后,这些题目做起来就比较简单了。

因为题目已经给我们拍好序了,所以我们遍历时遇到相同值的节点时,直接跳到下一个节点就好了,像 [1,1,2 ] ,直接跳到下一个节点是 2,就可以把当前的节点 1 赋值给 result.next 了。

public ListNode deleteDuplicates(ListNode head) {
        ListNode result = new ListNode(-1);
        ListNode temp = result;
        while(head!=null){
            while(head.next!=null && head.val == head.next.val){
                //跳过这个节点
                head = head.next;
            }
            temp.next = head;
            head = head.next;
            temp = temp.next;
        }
        return result.next;
    }

image.png

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。