📌  相关文章
📜  删除双向链表中所有能被K整除的节点(1)

📅  最后修改于: 2023-12-03 14:50:18.726000             🧑  作者: Mango

删除双向链表中所有能被K整除的节点

问题描述

给定一个双向链表和一个正整数 k,请实现一个函数,删除该链表中所有节点的值为 k 的倍数的节点。

解决思路

遍历链表,对于每一个节点,判断它的值是否为 k 的倍数,如果是,则删除该节点。删除一个节点需要考虑两个问题:

  1. 要删除的节点是头节点或尾节点怎么办?
  2. 要删除的节点前后如何衔接?

对于第一个问题,可以分别考虑头节点和尾节点的情况。对于头节点,直接将 next 赋值给 head 即可,对于尾节点,需要将前一个节点的 next 指针置为 NULL。

对于第二个问题,可以使用双指针法来解决。设当前节点为 p,它的前一个节点为 pre,它的后一个节点为 next,当要删除节点 p 时,将 pre 的 next 指向 next,将 next 的 pre 指向 pre。

代码实现
class ListNode:
    def __init__(self, val=0, next=None, prev=None):
        self.val = val
        self.next = next
        self.prev = prev

def removeMultipleOfK(head: ListNode, k: int) -> ListNode:
    dummy = ListNode(next=head)
    pre = dummy
    cur = head
    while cur:
        if cur.val % k == 0:
            pre.next = cur.next
            if cur.next:
                cur.next.prev = pre
            cur = pre.next
        else:
            pre = pre.next
            cur = cur.next
    return dummy.next
时间复杂度

遍历链表一次,时间复杂度为 O(n),其中 n 为链表的长度。

空间复杂度

只需要常数级别的额外空间,空间复杂度为 O(1)。