You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多级有序链表的插入与删除操作设计与实现求助

嘿,我来帮你搞定这个多级有序链表的插入和删除操作!咱先把核心规则理清楚,再一步步讲思路、上可运行的代码~

多级有序链表的插入与删除实现

先明确链表的核心特性

再确认下你给出的规则,确保咱理解一致:

  • 每行是有序单链表:用next指针连接同行情节点
  • 行与行用down指针串联:每行的头节点down指向下一行的头节点
  • 行长度规则:除最后一行外,每行固定4个元素;最后一行元素数量不超过4个
  • 全局有序:下一行的第一个元素严格大于上一行的最后一个元素,所以整个链表的所有元素是递增序列

一、插入操作的实现思路

插入的核心是保持全局有序和行长度规则,步骤如下:

  1. 找插入的行:从第一行开始,遍历每行的末尾元素,要么找到「末尾元素≥新值」的行(新值就插在这行),要么直接走到最后一行(新值比所有元素都大)
  2. 单行内有序插入:在目标行里找到第一个比新值大的节点,把新节点插在它前面;如果所有节点都比新值小,就插在行尾
  3. 行拆分(如果需要):如果插入后该行元素数超过4,就把该行拆成「前4个元素的原行」和「剩余元素的新行」,调整down指针,让原行的down指向新行,新行的down指向原来的下一行——因为原行是有序的,拆分后新行的第一个元素必然大于原行末尾,符合规则

二、删除操作的实现思路

删除要保证删除后依然符合行长度规则,步骤如下:

  1. 找目标节点:遍历所有行的节点,找到值匹配的节点;如果遍历完所有行都没找到,就提示不存在
  2. 删除节点:调整前驱节点的next指针跳过目标节点;如果目标是行头,还要更新该行的头节点(以及上一行的down指针,或者整个链表的头)
  3. 行补全(如果需要):如果删除后当前行是「非最后一行」且元素数<4,就从下一行的开头拿一个元素补到当前行末尾;如果下一行因此变成元素数<4的非最后一行,就继续重复补全逻辑,直到所有非最后一行都保持4个元素

完整代码实现(Python)

1. 节点类定义

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

2. 插入函数

def insert(head, val):
    # 步骤1:找到要插入的目标行
    current_row_head = head
    prev_row_head = None
    
    while True:
        # 获取当前行的最后一个节点
        last_node = current_row_head
        while last_node.next:
            last_node = last_node.next
        # 判断是否在当前行插入:要么当前行末尾≥新值,要么是最后一行
        if last_node.val >= val or not current_row_head.down:
            break
        # 否则往下一行找
        prev_row_head = current_row_head
        current_row_head = current_row_head.down
    
    # 步骤2:在目标行插入新节点
    new_node = Node(val)
    # 插入到行头的情况
    if current_row_head.val >= val:
        new_node.next = current_row_head
        # 如果是第一行的头,更新整个链表的头
        if not prev_row_head:
            head = new_node
        else:
            prev_row_head.down = new_node
        current_row_head = new_node
    else:
        # 找到插入位置的前驱节点
        prev = current_row_head
        while prev.next and prev.next.val < val:
            prev = prev.next
        new_node.next = prev.next
        prev.next = new_node
    
    # 步骤3:检查是否需要拆分当前行
    count = 0
    temp = current_row_head
    while temp:
        count += 1
        temp = temp.next
    
    if count > 4:
        # 拆分出前4个元素作为原行,剩下的作为新行
        split_point = current_row_head
        # 走到第4个节点
        for _ in range(3):
            split_point = split_point.next
        new_row_head = split_point.next
        split_point.next = None
        # 调整down指针
        new_row_head.down = current_row_head.down
        current_row_head.down = new_row_head
    
    return head

3. 删除函数

def delete(head, val):
    if not head:
        print("链表为空,无法执行删除操作")
        return head
    
    current_row_head = head
    prev_row_head = None
    target_node = None
    prev_target = None
    found = False
    
    # 步骤1:遍历找到目标节点
    while current_row_head and not found:
        prev = None
        temp = current_row_head
        while temp:
            if temp.val == val:
                target_node = temp
                prev_target = prev
                found = True
                break
            prev = temp
            temp = temp.next
        if not found:
            prev_row_head = current_row_head
            current_row_head = current_row_head.down
    
    if not found:
        print(f"值 {val} 不存在于链表中")
        return head
    
    # 步骤2:删除目标节点
    if not prev_target:
        # 目标是行头,更新行头指针
        new_row_head = target_node.next
        if not prev_row_head:
            head = new_row_head
        else:
            prev_row_head.down = new_row_head
        current_row_head = new_row_head
    else:
        prev_target.next = target_node.next
    
    # 步骤3:补全行长度(非最后一行必须保持4个元素)
    while current_row_head and current_row_head.down:
        # 计算当前行的元素数量
        count = 0
        temp = current_row_head
        while temp:
            count += 1
            temp = temp.next
        if count == 4:
            # 数量符合要求,停止处理
            break
        # 从下一行取第一个元素补充到当前行末尾
        next_row_head = current_row_head.down
        take_node = next_row_head
        next_row_head = next_row_head.next
        
        # 更新下一行的头指针
        if not next_row_head:
            current_row_head.down = None
        else:
            current_row_head.down = next_row_head
        
        # 把取来的节点放到当前行末尾
        temp = current_row_head
        while temp.next:
            temp = temp.next
        temp.next = take_node
        take_node.next = None
        
        # 继续处理下一行的长度问题
        current_row_head = next_row_head
    
    # 清理空的最后一行
    temp = head
    while temp and temp.down:
        if not temp.down.next and temp.down.val is not None:
            temp.down = None
        temp = temp.down
    
    return head

4. 链表打印函数(用于测试)

def print_linked_list(head):
    current_row = head
    while current_row:
        temp = current_row
        while temp:
            print(temp.val, end="->")
            temp = temp.next
        print("|")
        current_row = current_row.down

测试示例

我们用你给出的初始链表来测试:

# 初始化你给出的链表
# 第一行:2->7->8->11
node2 = Node(2)
node7 = Node(7)
node8 = Node(8)
node11 = Node(11)
node2.next = node7
node7.next = node8
node8.next = node11

# 第二行:13->16->17->21
node13 = Node(13)
node16 = Node(16)
node17 = Node(17)
node21 = Node(21)
node13.next = node16
node16.next = node17
node17.next = node21
node11.down = node13

# 第三行:22->23->27->29
node22 = Node(22)
node23 = Node(23)
node27 = Node(27)
node29 = Node(29)
node22.next = node23
node23.next = node27
node27.next = node29
node21.down = node22

# 第四行:30->32
node30 = Node(30)
node32 = Node(32)
node30.next = node32
node29.down = node30

head = node2

print("初始链表:")
print_linked_list(head)

# 插入测试:插入9
head = insert(head, 9)
print("\n插入9后的链表:")
print_linked_list(head)

# 删除测试:删除16
head = delete(head, 16)
print("\n删除16后的链表:")
print_linked_list(head)

运行后你就能看到插入和删除后的链表结构,完全符合规则~

内容的提问来源于stack exchange,提问作者Ranju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:22:33