Python 程序员面试金典 面试题 02.01. 移除重复节点

第二章的题目偏向于链表,我建议用Python刷的话先了解下Python链表
在这里插入图片描述
先放个易于理解的版本(额,不是链表,而是列表),还不是leetcode里那种格式的

lst = [1, 3, 3, 3, 2, 1]
set_lst = set(lst)	//去重,留下该出现的元素
lst1 = list(set_lst)	//去重后的列表
lst2 = []	//空表,用来存放正确顺序的列表

for i in range(len(lst)): //遍历要排序的列表
    for j in range(len(lst1)): //遍历去重列表
        if lst[i] == lst1[j] and lst[i] not in lst2:	//如果该元素在两个列表中都出现且不在正确顺序的列表里
            lst2.append(lst[i])	//添加该元素到正确顺序的列表中
            break	//找下一个
    if len(lst2) == len(lst1):	//如果已经找完了就没必要继续遍历了
        break

就是利用set储存已有的节点值,遇到重复的就使得前一个节点的next指向next.next

class Solution:
    def removeDuplicateNodes(self, head: ListNode) -> ListNode:
        val_set=set()
        prev=ListNode(-1)
        prev.next=head

        while prev.next:
            if prev.next.val in val_set:
                prev.next=prev.next.next
            else:
                val_set.add(prev.next.val)
                prev=prev.next
            
        return head

最佳解法
先把头结点放到home缓冲区里面,然后每次判断cur节点的next节点,可以这样理解,思路一种,我们使用cur节点记录当前节点,使用pre节点记录当前节点的前驱节点,这里的改进就是使用cur记录思路1中的pre,使用cur.next记录思路一中的cur。

class Solution:
    def removeDuplicateNodes(self, head: ListNode) -> ListNode:
        if not head or not head.next: return head
        home = defaultdict(int)
        cur = head
        home[head.val] += 1
        while cur.next:
            if home[cur.next.val] >= 1: 
#这里的判断条件是>=1, 原因是当前节点之前的节点值都进了缓冲区,则判断当前几点的next的值,有可能已经进过了,经过了,就是等于1
                cur.next = cur.next.next
            else:
                home[cur.next.val] += 1
                cur = cur.next
        return head
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值