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

基于行列索引在稀疏矩阵单链表中插入指定值的算法问询

嘿,作为数据结构新手能花72小时死磕这个问题,这份钻研精神必须点个赞!针对你要在稀疏矩阵单链表中按行列索引插入指定值的需求,最适用的是行优先定位插入算法,下面我一步步给你拆解清楚:

适用的插入算法:行优先定位插入法

前提:明确链表节点结构

首先假设你的单链表是用三元组节点存储稀疏矩阵的,这是稀疏矩阵单链表最常见的存储方式,节点结构大概是这样(用C语言伪代码示例):

typedef struct Node {
    int row;    // 行索引
    int col;    // 列索引
    int value;  // 元素值
    struct Node* next;
} Node;

你的链表应该是按行优先顺序排列的——行号从小到大,同一行内列号从小到大,这个顺序是算法能高效执行的基础。

核心插入逻辑

要插入(目标行r=0, 目标列c=4, 值v=8),我们需要遍历链表找到合适的插入位置,保证插入后链表依然维持行优先的有序性,具体步骤如下:

  1. 初始化遍历指针

    • 用current指针遍历链表节点,prev指针记录current的前一个节点(方便后续插入操作)。
    • 初始状态:prev = NULL,current = 链表头节点。
  2. 遍历链表,精准定位插入点
    循环遍历直到找到插入位置:

    • 如果current的行号 > 目标行r:说明目标位置在当前节点之前,直接跳出循环准备插入。
    • 如果current的行号 == 目标行r:
      • 若current的列号 > 目标列c:插入到当前节点前面即可。
      • 若current的列号 == 目标列c:这说明该位置已有元素,直接更新current->value = v即可,不需要插入新节点。
    • 如果current为NULL(遍历到链表末尾):直接把新节点插在链表最后。
  3. 执行插入操作

    • 如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:47:41