算法:【巧遇】 删除排序链表中的重复元素

584 阅读3分钟

前言

 今天一大早醒来,摸起手机,照例打开leetcode的APP,想看看今天准备刷哪道算法题,一进去就看见了昨天晚上新上线的《删除排序链表中的重复元素》,于是就开刷了,然后就有了这篇文章···

题目:

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

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

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

输出:[1,2]

思路:
   我们可以先审一下题,它说给我们一个  按升序排列的链表  那重复的数字应该是连续出现的,那我们等下写代码的时候就只需遍历它一遍即可删除重复的数字。
  接下来,我们应该想着怎么删除这个连续着的重复数字,题目给了我们一个head链表的头结点,那我们可以声明一个新的cur初始化一下head,然后通过next属性  来判断cur.val===cur.next.val是否为真来判断它是否重复,具体过程下面会说。

1.在写代码的过程中,我们一定要考虑到它的严谨性,就是方方面面的情况我们都要考虑到,首先第一种情况就是这个链表是否为空,这是我们很容易忽视的地方,
if (!head) {
        return head;
    }

在这里我们首先就可以写一个if条件语句来判断他是否为空,为空的话就直接返回head就好了
在这里有一个需要注意的细节,就是(!head)的意思是当他为空的时候,才为true值,才会执行if语句。

好,我们接着写
处理完特殊情况后我们就要开始判断链表里是否有重复的值了,我们先看代码,再来解释:

 while (cur.next) {
        if (cur.val === cur.next.val) {
            cur.next = cur.next.next;
        } else {
            cur = cur.next;
        }
    }

在这里,我们先用了while语气来判断cur.next下标是否存在,在这里这句代码起到了两个作用

  1. 判断是否有链表只存在一个值得特殊情况
  2. 为了,当循环结束时,跳出循环而准备的



链表的数值的个数大于一的时候,我们就可以用

cur.val===cur.next.val

在if语气中判断,如果重复的话,就让

cur.next=cur.next.next

让cur.next下标向下进一,变成cur.next.next继续比较后面是否还有相等的值,直到遇到不相等的值,if里面的条件不成立,那就向下运行else里的代码
此时,我们要考虑清楚的是cur的下标为哪一个?
应该为重复数字的最后一个对不对,所以当else里的代码执行的时候cur=cur.next,那么就成功的避开了重复的数字,也就相当于删除了重复的。



总结

  好了,到这里,也就要结束了,在这里我是用js写的

写这篇文章的目的呢,只是单纯的想复习一遍,让自己的印象更深刻,当然如果能帮到你们更好了

如果觉得写的不好,请勿喷!您可以去看官方的解答,那里更好!!!