题解 | #删除链表中重复的结点#
题目: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