题目链接
82. 删除排序链表中的重复元素 II - 力扣(LeetCode)
解题思路
题意:在一个有序链表中,如果一个节点的值出现不止一次,那么把所有等于此值的节点删除掉。
重点:有序链表,所以,一个节点的值不止一次出现,那他们必定相邻。
递归
deleteDuplicates(head)即删除head作为开头的有序链表,值出现重复的节点。
递归终止条件
- 如果head为空,那么肯定没有值出现重复的节点,直接返回head;
- 如果head.next为空,那么说明链表中只有一个节点,也没有值出现重复的节点,也直接返回head。
递归调用
什么时候需要递归?
- 如果head.val != head.next.val,说明头节点的值不等于下一个结点的值,所以当前的head节点必须保留;但是head.next节点要不要保留呢?我们还不知道,需要对head.next进行递归,即对head.next进行递归,即对head.next作为头节点的链表,去除值重复的节点。所以head.next = deleteDuplicates(head.next)
- 如果head.val == head.next.val,说明头节点的值等于下一个节点的值,所以当前的head节点必须删除,并且head之后所有与head.val相等的节点都需要删除;删除到哪个节点为止呢?需要用move指针一直向后遍历寻找与head.val不等的节点。此时move节点之前的节点都不保留了,因此返回deleteDuplicates(move)
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
if head.val != head.next.val:
head.next = self.deleteDuplicates(head.next)
else:
move = head.next
while move and head.val == move.val:
move = move.next
return self.deleteDuplicates(move)
return head