题解 | #升序链表的删除#

升序链表的删除

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,所以将需要移除的状态传给递归中的下一层(链表中是上一个节点),上一个节点拿到历史记录后进行删除操作,并同时将自己是否需要删除传给上一个节点。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 20:55
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务