📜  门| GATE-CS-2014-(Set-1) |第 30 题(1)

📅  最后修改于: 2023-12-03 15:28:43.542000             🧑  作者: Mango

题目描述

给定一个单向链表,删除其中所有值为重复值的节点,并返回链表的头部指针。例如,对于链表1->2->3->3->4->4->5,返回链表1->2->5。

题目分析

首先可以将链表中存在重复值的节点进行删除操作。该题可以遍历整个链表,同时检测每一个节点的值是否与前一个节点的值相等,如果相等,那么就删除该节点。为了方便删除链表中的节点,需要在链表头部添加一个虚拟节点dummy。

解决方案

首先定义一个虚拟节点dummy,并将其next指向head,然后定义两个指针,分别为prev和cur,分别指向虚拟节点dummy和第一个节点head。在遍历的过程中,如果发现cur.val等于cur.next.val,那么就需要删除cur,并将prev的next指向cur.next,否则就让prev指向cur,cur指向cur.next。

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
        
def delete_duplicates(head):
    dummy = ListNode(0)
    dummy.next = head
    prev, cur = dummy, head
    while cur:
        while cur.next and cur.val == cur.next.val:
            cur = cur.next
        if prev.next == cur:
            prev = prev.next
        else:
            prev.next = cur.next
        cur = cur.next
    return dummy.next
复杂度分析

时间复杂度:O(n),其中n是链表中节点的数目。

空间复杂度:O(1)。