📅  最后修改于: 2023-12-03 14:50:18.726000             🧑  作者: Mango
给定一个双向链表和一个正整数 k,请实现一个函数,删除该链表中所有节点的值为 k 的倍数的节点。
遍历链表,对于每一个节点,判断它的值是否为 k 的倍数,如果是,则删除该节点。删除一个节点需要考虑两个问题:
对于第一个问题,可以分别考虑头节点和尾节点的情况。对于头节点,直接将 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)。