📅  最后修改于: 2023-12-03 15:08:01.731000             🧑  作者: Mango
在已经排序好的双向链表中插入一个新值并保持链表的有序性是一个经典的问题。对于这个问题,我们可以使用以下算法:
时间复杂度: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 指针是需要注意的地方。