首页 > 编程语言 > 详细

算法 第五部分 删除排序链表中的重复元素

时间:2021-01-10 11:40:07      阅读:30      评论:0      收藏:0      [点我收藏+]

1、这个题用到我们之前学过的遍历链表操作和删除链表中的节点,

2、题目描述,给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次

3、然后给了两个示例。第一个示例的输入是112,然后输出是12,因为两个1重复了,所以说删除了其中一个

4、使得1这个元素只出现了一次,第二个例子的输入是11233,最后变成了123,就是把重复的1和重复的3删除了

5、因为输入的链表是有序的,所以重复元素一定相邻,有了这个前提之后,我们这道题就迎刃而解了,我们只需要遍历这个链表,如果发现当前元素,和下个元素相同,就删除下个元素,我们

6、知道重复元素一定是相邻的,所以我们就可以判断当前元素是否和下个元素相同,来找出这个重复元素,并把所有的重复元素给删除

7、第一步就是遍历链表,如果发现当前元素和下个元素值相同,就删除下个元素,等遍历结束之后,我们直接返回原链表的头部就行了

8、因为我们的删除操作是在原链表上进行的,也就意味着我们修改了原来的链表,我们没有造新的链表,所以我们只需要返回原来的链表就可以了,这道题还是比较简单的

9、因为要遍历链表,所以说我们还是新建一个指针,首先指向这个头部,然后呢,遍历链表,这是一个while循环体,接下来我们要在while循环体里面执行嘎嘎才的逻辑,刚才说的逻辑是

10、当前这个节点的值如果等于下个节点的值,我们就要把下个节点删除,我们就删除下个节点,直接让这个next=p.next.next,更改它的链表指向就可以删除链表中的元素

11、在这里,由于我们使用了p.next.val,如果这个p.next为空的化,那么这里就会报错,所以我们要在这个while循环体里面增加一个条件,不仅保证当前元素是有值得,而且还要保证当前元素得下个元素

12、它也是有值的额,那么这个操作做完之后,我们补充下p=p.next,这个链表自己,不停的去遍历下去我们return一下这个head

13、整一个三个都相同的元素,可以看出我们的输出多了一个1,也就是说我们并没有删除所有的重复元素,我们露了一个,

14、我们只需要,p=p.next放到else里面就可以了。也就是说如果当前元素和下个元素相同,我们直接就把下个元素删除,但是我们的指针就不往后面移了

15、因为有可能下下个元素和它还是有可能相同的,所以我们还是要再判断一次,假如说他们不相同了,我们依旧执行我们之前的逻辑

16、把指针往后挪动

17、这道题的时间复杂度显然是on,因为它有一个while循环体,n呢就是这个链表的长度,然后他的空间复杂度是o1为什么呢,因为我们没有额外的存储任何线性增长的变量

总结:不做总结

 

算法 第五部分 删除排序链表中的重复元素

原文:https://www.cnblogs.com/wangwei07/p/14257299.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!