📌  相关文章
📜  删除左侧具有较小值的链表节点(1)

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

删除左侧具有较小值的链表节点

在链表中,存在一个操作,即删除左侧具有较小值的节点。这个操作常常用在数据流中,当新的元素加入时,需要将比当前元素小的节点都从链表中删除。

以下是一个简单的实现方法:

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

def delete_left_smaller(head):
  # 反转链表
  head = reverse(head)
  # 删除左侧较小节点
  cur = head
  max_val = float('-inf')
  while cur and cur.next:
    if cur.next.val < max_val:
      cur.next = cur.next.next
    else:
      max_val = cur.next.val
      cur = cur.next
  # 再反转回来
  return reverse(head)

def reverse(head):
  prev = None
  cur = head
  while cur:
    temp = cur.next
    cur.next = prev
    prev = cur
    cur = temp
  return prev

这个算法的时间复杂度为O(n),空间复杂度为O(1)。

说明:

首先将链表反转,这样可以从左到右遍历链表,并保证删除左侧较小节点不会影响后面的节点。接着遍历链表,将当前最大值存储在max_val变量中,如果遇到比max_val小的节点,就直接跳过这个节点,否则更新max_val,并将cur指向下一个节点。最后再将链表反转回来即可。

下面是一个测试例子,其中链表为1 -> 8 -> 3 -> 10 -> 6 -> 5 -> 2 -> 7。

def print_list(head):
  cur = head
  while cur:
    print(cur.val, end = ' ')
    cur = cur.next

head = Node(1)
head.next = Node(8)
head.next.next = Node(3)
head.next.next.next = Node(10)
head.next.next.next.next = Node(6)
head.next.next.next.next.next = Node(5)
head.next.next.next.next.next.next = Node(2)
head.next.next.next.next.next.next.next = Node(7)

new_list = delete_left_smaller(head)
print_list(new_list)

输出结果为:10 6 7。

上述实现方法适用于LRU缓存淘汰算法