返回

剑指 Offer 83:删除排序链表中的重复元素,你的程序排好了吗?

前端

一、题目

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入:1->1->2->3->3
输出:1->2->3

示例 2:

输入:1->1->1->2->3
输出:1->2->3

二、思路分析

这道题要求删除排序链表中的重复元素,我们可以利用链表有序的特性来解决这个问题。由于链表中的元素是升序排列的,因此重复元素一定是相邻的。我们可以遍历链表,将当前节点与下一个节点进行比较,如果两个节点的值相等,则删除当前节点,否则将当前节点保留。

三、解题代码

def deleteDuplicates(head):
    """
    删除排序链表中的重复元素

    参数:
        head: 链表头节点

    返回值:
        无重复元素的链表头节点
    """
    # 判断链表是否为空
    if head is None:
        return None

    # 设置一个哑节点作为新的链表的头节点
    dummy = ListNode(0)
    dummy.next = head

    # 设置一个指针指向哑节点
    prev = dummy

    # 遍历链表
    while head is not None:
        # 判断当前节点是否与下一个节点的值相等
        if head.val == head.next.val:
            # 如果相等,则跳过当前节点
            while head.next is not None and head.val == head.next.val:
                head = head.next
            # 将当前节点的下一个节点赋给prev节点的下一个节点
            prev.next = head.next
        else:
            # 如果不相等,则将当前节点的下一个节点赋给prev节点的下一个节点
            prev.next = head
            # 将prev节点的下一个节点设置为head节点
            prev = head
        # 将head节点的下一个节点设置为下一个节点
        head = head.next

    # 返回哑节点的下一个节点作为无重复元素的链表的头节点
    return dummy.next

四、总结

这道题是一道经典的链表操作题,考察的是对链表的理解和操作能力。通过利用链表有序的特性,我们可以轻松地解决这道题。希望本文对您有所帮助,如果您有任何问题,请随时留言。