📜  在已排序的双向链表中以排序方式插入值(1)

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

在已排序的双向链表中以排序方式插入值

介绍

在已经排序好的双向链表中插入一个新值并保持链表的有序性是一个经典的问题。对于这个问题,我们可以使用以下算法:

  1. 如果链表为空,将新值设置为链表头节点。
  2. 否则,从链表头节点开始遍历链表,找到插入位置。
  3. 插入新节点,更新插入位置前后节点的 next 和 prev 指针。

时间复杂度:O(n)

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

def insert_sorted_list(head, val):
    new_node = Node(val)
    if not head:
        return new_node
    
    cur = head
    while cur.next and cur.next.val < val:
        cur = cur.next
    
    if not cur.next:
        cur.next = new_node
        new_node.prev = cur
    else:
        new_node.next = cur.next
        new_node.prev = cur
        cur.next.prev = new_node
        cur.next = new_node
    
    return head
示例
# 创建有序链表
node1 = Node(1)
node3 = Node(3)
node5 = Node(5)
node7 = Node(7)
node1.next = node3
node3.prev = node1
node3.next = node5
node5.prev = node3
node5.next = node7
node7.prev = node5

# 插入新值
head = insert_sorted_list(node1, 4)

# 遍历链表
cur = head
while cur:
    print(cur.val)
    cur = cur.next
    
# 输出:1 3 4 5 7
总结

在已经排序好的双向链表中插入新值需要从头节点开始遍历找到插入位置。算法的时间复杂度为 O(n)。判断链表是否为空,以及更新节点的 next 和 prev 指针是需要注意的地方。