这道题跟删除链表重复元素相比有了一个升级,就是只要是重复的元素一个也不要,要是列表的话,还记得python里的Counter吧,对就是那个做文本分类最常用的,用这个就好了,要不然就用字典计数,很简单的。但是链表嘛,有他自己的特性。
1.题目
原题
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
例子
输入: 1->2->3->3->4->4->5
输出: 1->2->5
2.解析
这道题的本质还是链表的循环。有几个小points。
- 新链表输出删除后的结果,新链表指定头部节点以后,让他连上原链表,这是为了保留头部元素,可以很方便的在原链表的基础上进行操作。
- 判断值是否相同,如果出现了一个新值,那么就循环链表,直到这个值消失,因为更新了next所以更改链表的指向就好了。
- 链表赋值后不要随便更改了,比如p=cur,cur=cur.next,那么p也是跟着改变的,注意一下先后顺序。
3.python代码
class Solution:
def deleteDuplicates(self, head):
if head is None or head.next is None:
return head
# pre = head
tmp = ListNode(0)
new = tmp
new.next = head
cur = head
# list_duplucate = []
while cur and cur.next:
if cur.val == cur.next.val:
val = cur.val
while cur and cur.val == val:
cur = cur.next
new.next = cur
# cur.next = cur.next.next
# cur = cur.next
# new.next = cur
else:
new = new.next
cur = cur.next
#在对cur进行操作会对new造成影响
#只要不对new进行赋值就不必整两个变量出来
return tmp.next