📌  相关文章
📜  删除链表中所有出现的给定键(1)

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

删除链表中所有出现的给定键

在链表中删除指定值的节点是一个经典问题。具体来说,我们需要通过遍历链表找到所有包含给定值的节点,并将其从链表中删除。

解题思路

我们可以使用两个指针:一个指针用于遍历整个链表,另一个指针用于指向需要删除的节点的前一个节点。

具体思路如下:

  1. 创建一个哑节点(dummy node)dummy,并将其 next 指针指向链表的头节点。
  2. 初始化两个指针 p 和 prev,初始时 p 指向头节点,prev 指向哑节点。
  3. 遍历整个链表,当 p 指向的节点的值等于给定值时,删除该节点。
  4. 在遍历过程中,不断移动指针 p 和 prev 将链表中所有值等于给定值的节点删除。
  5. 返回 dummy 的 next 指针作为修改后链表的头节点。

参考代码如下:

def removeElements(head, val):
    # 创建哑节点
    dummy = ListNode(-1)
    dummy.next = head
    # 初始化指针
    p, prev = head, dummy
    # 遍历整个链表
    while p:
        # 删除节点
        if p.val == val:
            prev.next = p.next
        else:
            prev = p
        p = p.next
    # 返回头节点
    return dummy.next
时间复杂度

时间复杂度为 O(n),其中 n 表示链表的长度。需要遍历整个链表。

空间复杂度

由于只需要使用常数级别的额外空间,因此空间复杂度为 O(1)。

总结

删除链表中所有出现的给定键是链表中比较经典的问题之一,面试中经常会涉及。掌握这个问题的解法可以大大提高面试的通过率。