题解 | #升序链表的删除#
升序链表的删除
https://www.nowcoder.com/practice/22243a45ec9b425ea608d5fe3f6bb1f6
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param head ListNode类 # @return ListNode类 # class Solution: def deleteDuplicates(self , head: ListNode) -> ListNode: # write code here # 链表去重 visited = set() def removeDu(head): if not head: return 0, head # hist ret, temphead = removeDu(head.next) # 看下一个是否需要remove # remove if ret: # 需要remove head.next = temphead.next # 删除递归前一个元素 temphead.next = None # rec if head.val in visited: # 当前需要remove visited.add(head.val) return 1, head else: # 当前不需要remove visited.add(head.val) return 0, head dummy = ListNode(-1) dummy.next = head ans = removeDu(dummy) return ans[1].next
链表去重。我们知道链表去重需要知道重复链表的前一个节点,并进行操作。所以我们在每个节点时,需要知道下一个节点是否需要移除。判断是否需要移除就需要在外部保留一个set来记录所有出现过的val。所以一旦head.val出现在set里面,说明当前是重复,需要移除的head,所以将需要移除的状态传给递归中的下一层(链表中是上一个节点),上一个节点拿到历史记录后进行删除操作,并同时将自己是否需要删除传给上一个节点。