![692121240e04b5471b6be85dbc4ee10f.png](https://img-blog.csdnimg.cn/img_convert/692121240e04b5471b6be85dbc4ee10f.png)
删除无序链表中的重复项
类型1
题目描述
给定一个无序的链表,去掉其重复项,并保留原顺序,例如链表1->3->1->5->5->7,去掉重复项后为1->3->5->7。
解决思路
主要思路为:通过两层循环直接在链表上进行删除操作,外层循环用一个指针从第一个节点开始遍历整个链表,然后内层循环用另一个指针遍历第一个节点之后的其余节点,将与外层循环遍历到的节点数据域相同的节点进行删除。整个过程入下图所示:
![2c53f88ba75bcbe025a7c93193413ca3.png](https://img-blog.csdnimg.cn/img_convert/2c53f88ba75bcbe025a7c93193413ca3.png)
代码
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if head is None:
return head
outer = head
while outer:
inpre = outer
inner = inpre.å
while inner:
if inner.val == outer.val:
inner = inner.next
inpre.next = inner
else:
inpre = inner
inner = inner.next
outer = outer.next
return head
测试
import random
head = ListNode(1)
cur = head
for i in range(20):
tmp = ListNode(random.randint(0,5))
cur.next = tmp
cur = cur.next
# 打印链表的函数
def print_linkedlist(r):
res = [r.val]
while True:
if r.next:
r = r.next
else:
break
res.append(r.val)
print(res)
print_linkedlist(head)
[1, 5, 0, 0, 2, 2, 4, 2, 1, 3, 1, 2, 2, 5, 1, 0, 1, 5, 0, 3, 2]
solution = Solution()
res = solution.deleteDuplicates(head)
print_linkedlist(res)
[1, 5, 0, 2, 4, 3]
类型2
题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解决思路
类型2的题目相较于类型1的最大的区别在于只保留没有重复出现过的数字,只要该数字重复出现过,那么就不会保留在最终的列表中,而不是仅仅让每个数字仅出现一次。与类型1的解决思路一致,依然通过两层循环进行遍历,需要注意的是因为题目中的链表不带头结点,但是第一个几点也存在被删除的可能,因此为了方便后续的处理,在第一个几点前增加头结点。
![03ac0cb0ad859b305f042b108b9ac37b.png](https://img-blog.csdnimg.cn/img_convert/03ac0cb0ad859b305f042b108b9ac37b.png)
外层循环从头结点开始遍历每一个节点,内层循环遍历外层循环遍历到的节点之后的节点,如果内层循环中遍历到的节点的数据域有跟外层循环节点的数据域相同的情况,内层循环中对应的节点需要删除,待内层循环结束,将外层对应的节点进行删除,如果内层没有重复的情况,则外层循环前移一个节点,继续内层循环,直到程序退出。
代码
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if head is None:
return head
new = ListNode(None)
new.next = head
head = new
outpre = head
outer = outpre.next
flag = False
while outer:
inpre = outer
inner = inpre.next
while inner:
if inner.val == outer.val:
flag = True
inner = inner.next
inpre.next = inner
else:
inpre = inner
inner = inner.next
if flag:
outer = outer.next
outpre.next = outer
flag = False
else:
outpre = outer
outer = outer.next
return head.next
测试
# 生成测试数据
head = ListNode(3)
cur = head
for i in [1,2,3,3,4,4,1,3,4,5,5]:
tmp = ListNode(i)
cur.next = tmp
cur = cur.next
print_linkedlist(head)
[3, 1, 2, 3, 3, 4, 4, 1, 3, 4, 5, 5]
solution = Solution()
res = solution.deleteDuplicates(head)
print_linkedlist(res)
[2]
![1b8059b7b2d02f73fe0b5b5594e32e32.png](https://img-blog.csdnimg.cn/img_convert/1b8059b7b2d02f73fe0b5b5594e32e32.png)