📜  给定随机指针时插入已排序的循环链表(1)

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

给定随机指针时插入已排序的循环链表

介绍

循环链表是一种常见的数据结构,它可以将链表头部和尾部连接起来,形成一个环形结构。在循环链表中,每个节点都有一个指针指向下一个节点,这样我们可以遍历整个链表。

在插入节点时,我们通常需要考虑保持链表的有序性,并且还需要处理随机指针的问题。随机指针是指在链表节点中,某些节点的指针指向链表中的任意一个节点,这增加了插入节点的难度。

在本文中,我们将介绍如何在给定随机指针时插入已排序的循环链表。我们会提供详细的说明和示例代码。

算法

插入新节点到已排序的循环链表,需要考虑以下几个步骤:

  1. 遍历链表,找到插入位置。
  2. 插入新节点,并将新节点的next指向下一个节点。
  3. 更新新节点的随机指针,以及原来指向当前节点的节点的随机指针。
  4. 如果当前节点为尾节点,则需要将尾节点的next指向新节点。

下面是具体的代码实现:

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

def insert_sorted_circular_list(head: Node, insert_node: Node) -> Node:
    if not head:
        insert_node.next = insert_node
        insert_node.random = insert_node
        return insert_node
    
    curr = head
    prev = None
    while True:
        if curr.val >= insert_node.val:
            break
        prev = curr
        curr = curr.next
        if curr == head:  # the end of a circle
            break

    if not prev:  # insert into the first position
        prev = head
        while prev.next != head:
            prev = prev.next
        insert_node.next = head
        head.random = insert_node
        prev.next = insert_node
        insert_node.random = prev
        return insert_node

    if curr == head and prev == head:  # insert into a one-node circle
        head.next = insert_node
        insert_node.next = head
        insert_node.random = head
        head.random = insert_node
        return insert_node

    prev.next = insert_node
    insert_node.next = curr
    curr.random = insert_node
    insert_node.random = prev
    return head
示例

考虑如下一个循环链表:

[3] ↔ [6] ↔ [7] ↔ [9] ↔ [None]
 │       │       ↑ 
 └───────┴───────┘

其中,数字表示节点的值。箭头表示链表节点的next指针,指向下一个节点。上箭头表示节点的random指针,指向随机的节点。

现在,插入一个新节点 [4, None, None] 到循环链表中:

head = Node(3, Node(6, Node(7, Node(9))))
head.random = None
head.next.next.next.next = head
head.next.random = head.next.next  # 6 -> 7
head.next.next.random = head      # 7 -> 3
head.next.next.next.random = head.next.next  # 9 -> 7
insert_node = Node(4)
insert_sorted_circular_list(head, insert_node)

插入后的循环链表为:

[3] ↔ [4] ↔ [6] ↔ [7] ↔ [9] ↔ [3]
 │                ↑ 
 └────────────────┘

可以看到,插入节点 [4] 并且正确更新了随机指针。