题解 | #删除链表中重复的结点#

题目:https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef

用到双指针来遍历链表。参考#删除链表的节点# https://blog.nowcoder.net/n/540f0c3f48b74437a9b4b61dde011d43

当链表不为空时,讨论: (1)如果cur和cur.next的值都相等,previous和current要怎么更新。对于previous的更新,又需要分情况讨论:previous在表头时和不在表头时。 (2)cur和cur.next的值不相等时,previous和current要怎么更新。

写法一:把previous一开始设成None的话,当cur和cur.next的值都相等时,对于previous的更新,需要分情况讨论:previous在表头时和不在表头时的情况。 此时返回就返回pHead。

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param pHead ListNode类 
# @return ListNode类
#
class Solution:
    def deleteDuplication(self , pHead: ListNode) -> ListNode:
        current=pHead
        previous=None
        while current and current.next:
            if current.val==current.next.val:#如果前后的值都相等
                temp=current.val
                while current and current.val==temp:
                    current=current.next#如果前后的值都等于temp,cur一直往下走
                if previous==None:#要移除的节点current就在表头节点时
                    pHead=current
                else:
                    previous.next=current#既然已经找到了相同节点的位置,那么就可以用上previous重新指了
            
            else:#如果前后值不相等,previous和current一起往下走
                previous=current
                current=current.next
        return pHead 

写法二:把previous设成一个有实值的节点,当cur和cur.next的值都相等时,对于previous的更新就不需要分情况讨论了。但是注意返回要返回新设置的节点的next(p0.next)。 注意以下写法是不对的: previous=ListNode(-1) previous.next=pHead current=pHead ... return previous.next或者return pHead 因为previous.next在变化,而最开始的pHead可能遍历过程中被删除,因此这两种return都不对。所以才需要引入一个p0=ListNode(-1),previous=p0以便后面返回。

class Solution:
    def deleteDuplication(self , pHead: ListNode) -> ListNode:
        p0=ListNode(-1)
        previous=p0
        previous.next=pHead
        current=pHead
        while current and current.next:
            if current.val==current.next.val:#如果前后的值都相等
                temp=current.val
                while current and current.val==temp:
                    current=current.next#如果前后的值都等于temp,cur一直往下走
                previous.next=current#既然已经找到了相同节点的位置,那么就可以用上previous重新指了
            
            else:#如果前后值不相等,previous和current一起往下走
                previous=current
                current=current.next
        return p0.next  
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务