基于行列索引在稀疏矩阵单链表中插入指定值的算法问询
嘿,作为数据结构新手能花72小时死磕这个问题,这份钻研精神必须点个赞!针对你要在稀疏矩阵单链表中按行列索引插入指定值的需求,最适用的是行优先定位插入算法,下面我一步步给你拆解清楚:
适用的插入算法:行优先定位插入法
前提:明确链表节点结构
首先假设你的单链表是用三元组节点存储稀疏矩阵的,这是稀疏矩阵单链表最常见的存储方式,节点结构大概是这样(用C语言伪代码示例):
typedef struct Node { int row; // 行索引 int col; // 列索引 int value; // 元素值 struct Node* next; } Node;
你的链表应该是按行优先顺序排列的——行号从小到大,同一行内列号从小到大,这个顺序是算法能高效执行的基础。
核心插入逻辑
要插入(目标行r=0, 目标列c=4, 值v=8),我们需要遍历链表找到合适的插入位置,保证插入后链表依然维持行优先的有序性,具体步骤如下:
初始化遍历指针
- 用
current指针遍历链表节点,prev指针记录current的前一个节点(方便后续插入操作)。 - 初始状态:
prev = NULL,current = 链表头节点。
- 用
遍历链表,精准定位插入点
循环遍历直到找到插入位置:- 如果
current的行号 > 目标行r:说明目标位置在当前节点之前,直接跳出循环准备插入。 - 如果
current的行号 == 目标行r:- 若
current的列号 > 目标列c:插入到当前节点前面即可。 - 若
current的列号 == 目标列c:这说明该位置已有元素,直接更新current->value = v即可,不需要插入新节点。
- 若
- 如果
current为NULL(遍历到链表末尾):直接把新节点插在链表最后。
- 如果
执行插入操作
- 如果
prev == NULL(插入到表头):让新节点的next指向原表头,新节点成为新的链表头。 - 其他情况:将
prev->next指向新节点,新节点的next指向current,完成插入。
- 如果
伪代码实现
function insertNode(head, targetRow, targetCol, targetVal): // 创建新节点 newNode = createNode(targetRow, targetCol, targetVal) prevNode = NULL currentNode = head while currentNode is not NULL: // 情况1:当前节点行号大于目标行,插入到当前节点前 if currentNode.row > targetRow: break // 情况2:同一行,当前列号大于目标列,插入到当前节点前 elif currentNode.row == targetRow: if currentNode.col > targetCol: break // 情况3:目标位置已有节点,直接更新值 elif currentNode.col == targetCol: currentNode.value = targetVal free(newNode) // 无需保留新节点 return head // 继续遍历下一个节点 prevNode = currentNode currentNode = currentNode.next // 执行插入操作 if prevNode is NULL: // 插入到表头 newNode.next = head head = newNode else: // 插入到prevNode和currentNode之间 prevNode.next = newNode newNode.next = currentNode return head
针对你的例子(插入(0,4,8))的执行流程
假设你的链表当前是按行优先排列的:
- 遍历到第0行的最后一个列号小于4的节点后,下一个节点要么是行号大于0的节点,要么是NULL。
- 找到这个位置后,把新节点
(0,4,8)插入到第0行最后一个节点的后面、行号>0的节点前面(如果存在的话)即可。
为什么这个算法最适用?
- 完全贴合稀疏矩阵单链表的存储规则,保证插入后链表的有序性,后续的查找、遍历操作依然高效。
- 时间复杂度为O(n),对于稀疏矩阵来说,n远小于矩阵的总元素数,属于高效的实现方式。
- 覆盖了所有边界场景:表头插入、中间插入、表尾插入、重复位置的元素更新。
内容的提问来源于stack exchange,提问作者Sharana Dharshikgan
相关产品推荐
相关产品推荐

