📜  门| GATE-CS-2004 |问题16(1)

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

问题描述

在一个排序的链表中,给定一个值,删除该值的所有节点。

函数签名
def deleteAllOccurances(head: ListNode, val: int) -> ListNode:
    pass
输入
  • head: 待操作链表头节点
  • val: 要删除的值
输出

返回删除后的链表头节点。

题解

本题要求我们在一个排序链表中删除所有值为 val 的节点。对于链表操作的问题,我们可以用双指针(快慢指针)来解决。

具体来说,我们可以维护一个指针 prev 指向当前节点的前一个节点,一个指针 cur 指向当前节点,然后一遍遍历链表,如果当前节点的值等于要删除的值,就删除当前节点(将 prev.next 指向 cur.next),否则就将 prev 指向 cur

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def deleteAllOccurances(head: ListNode, val: int) -> ListNode:
    # 处理头节点
    while head and head.val == val:
        head = head.next
    if not head:
        return head
    # 处理非头节点
    prev, cur = head, head.next
    while cur:
        if cur.val == val:
            prev.next = cur.next
        else:
            prev = cur
        cur = cur.next
    return head

时间复杂度 $O(n)$,空间复杂度 $O(1)$。