第二章的题目偏向于链表,我建议用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