LeetCode刷题(十)

移除重复节点

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:

输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:

链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:

如果不得使用临时缓冲区,该怎么解决?

java

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def removeDuplicateNodes(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head:
            return head
        r = head
        visited = [head.val]
        while r and r.next:
            if r.next.val not in visited:
                visited.append(r.next.val)
                r = r.next
            else:
                r.next=r.next.next
        return head

python

class Solution:
    def removeDuplicateNodes(self, head: ListNode) -> ListNode:

        if not head:#如果head里本来就没东西,那就返回head本身
            return head

        r = head #r是head的代言人,负责迭代和更新,head负责原地不动
        record = {head.val} #record负责储存看见过的值。现在已经储存了第一个值

        while r and r.next: #只要r接下来还有东西,就看看下一个东西是不是已经在record当中 
            #这里判断时要同时符合这两个条件,因为如果r已经是None了,判断r.next会报错,所以每次得先判断r

            if r.next.val not in record: #如果下一环的值没被储存过,不用对head作任何修改
                record.add(r.next.val) #在record中添加这个值
                r = r.next #并且让r进入下一环

            else: #如果下一环的值已经见过了
                r.next = r.next.next #直接让r的下一环变为下下环,即把r.next这一环删了
                #这里不用再写"r=r.next"让r进入下一环,原因是r.next已经更改了,要重新进入loop判断现在的r.next(即原来的r.next.next)是否已经遇见过
            
        return head


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值