python列表删除重复项_删除无序链表中的重复项

692121240e04b5471b6be85dbc4ee10f.png

删除无序链表中的重复项

类型1

题目描述

给定一个无序的链表,去掉其重复项,并保留原顺序,例如链表1->3->1->5->5->7,去掉重复项后为1->3->5->7。

解决思路

主要思路为:通过两层循环直接在链表上进行删除操作,外层循环用一个指针从第一个节点开始遍历整个链表,然后内层循环用另一个指针遍历第一个节点之后的其余节点,将与外层循环遍历到的节点数据域相同的节点进行删除。整个过程入下图所示:

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

外层循环从头结点开始遍历每一个节点,内层循环遍历外层循环遍历到的节点之后的节点,如果内层循环中遍历到的节点的数据域有跟外层循环节点的数据域相同的情况,内层循环中对应的节点需要删除,待内层循环结束,将外层对应的节点进行删除,如果内层没有重复的情况,则外层循环前移一个节点,继续内层循环,直到程序退出。

代码

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值