82. 删除排序链表中的重复元素 II(中)

题目

  • 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

题解:双指针

  • 题目给的头节点是第一个元素,处理起来较麻烦(需单独处理头节点);加上习惯用一个空的头节点,所以本题新建了一个虚拟头节点,以便统一处理整个链表,最后返回的时候注意返回虚拟头节点的下一个节点即可。
# 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 head is None or head.next is None:
            return head
        dummy = ListNode(0)  # 创建虚拟头节点
        dummy.next = head#虚拟头节点指向原来的head
        prev = dummy  # 用于记录当前不重复节点的前一个节点
        while head and head.next:
            if head.val == head.next.val:
                # 找到重复节点的最后一个元素
                while head.next and head.val == head.next.val:
                    head = head.next
                prev.next = head.next  # 删除重复节点,头节点的下一个节点直接是不重复的第一个
            else:
                prev = prev.next#当head和他下一个点不重复的时候,prev指针后移一位
            head = head.next#head指针后移一位
        return dummy.next     #由于dummy是虚拟节点直接返回他的下一个      
posted @ 2024-01-27 15:31  Frommoon  阅读(2)  评论(0编辑  收藏  举报