前言
今天一大早醒来,摸起手机,照例打开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下标是否存在,在这里这句代码起到了两个作用
- 判断是否有链表只存在一个值得特殊情况
- 为了,当循环结束时,跳出循环而准备的
链表的数值的个数大于一的时候,我们就可以用
cur.val===cur.next.val
在if语气中判断,如果重复的话,就让
cur.next=cur.next.next
让cur.next下标向下进一,变成cur.next.next继续比较后面是否还有相等的值,直到遇到不相等的值,if里面的条件不成立,那就向下运行else里的代码
此时,我们要考虑清楚的是cur的下标为哪一个?
应该为重复数字的最后一个对不对,所以当else里的代码执行的时候cur=cur.next,那么就成功的避开了重复的数字,也就相当于删除了重复的。
好了,到这里,也就要结束了,在这里我是用js写的总结
写这篇文章的目的呢,只是单纯的想复习一遍,让自己的印象更深刻,当然如果能帮到你们更好了
如果觉得写的不好,请勿喷!您可以去看官方的解答,那里更好!!!