多级有序链表的插入与删除操作设计与实现求助
嘿,我来帮你搞定这个多级有序链表的插入和删除操作!咱先把核心规则理清楚,再一步步讲思路、上可运行的代码~
多级有序链表的插入与删除实现
先明确链表的核心特性
再确认下你给出的规则,确保咱理解一致:
- 每行是有序单链表:用
next指针连接同行情节点 - 行与行用
down指针串联:每行的头节点down指向下一行的头节点 - 行长度规则:除最后一行外,每行固定4个元素;最后一行元素数量不超过4个
- 全局有序:下一行的第一个元素严格大于上一行的最后一个元素,所以整个链表的所有元素是递增序列
一、插入操作的实现思路
插入的核心是保持全局有序和行长度规则,步骤如下:
- 找插入的行:从第一行开始,遍历每行的末尾元素,要么找到「末尾元素≥新值」的行(新值就插在这行),要么直接走到最后一行(新值比所有元素都大)
- 单行内有序插入:在目标行里找到第一个比新值大的节点,把新节点插在它前面;如果所有节点都比新值小,就插在行尾
- 行拆分(如果需要):如果插入后该行元素数超过4,就把该行拆成「前4个元素的原行」和「剩余元素的新行」,调整
down指针,让原行的down指向新行,新行的down指向原来的下一行——因为原行是有序的,拆分后新行的第一个元素必然大于原行末尾,符合规则
二、删除操作的实现思路
删除要保证删除后依然符合行长度规则,步骤如下:
- 找目标节点:遍历所有行的节点,找到值匹配的节点;如果遍历完所有行都没找到,就提示不存在
- 删除节点:调整前驱节点的
next指针跳过目标节点;如果目标是行头,还要更新该行的头节点(以及上一行的down指针,或者整个链表的头) - 行补全(如果需要):如果删除后当前行是「非最后一行」且元素数<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
相关产品推荐
相关产品推荐

