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

链表指定索引节点移至表头失败:节点被误删问题排查

问题分析与修正方案

你的代码核心问题是链表头指针按值传递,导致函数内部修改头指针的操作无法同步到外部,看起来节点被删除,实际是外部头指针没更新,找不到被移动的节点。

问题原因

C语言参数是值传递,函数FindPrintMove里的start是外部头指针的副本。你在函数里执行start = cur只是修改了这个局部副本,外部的原头指针完全没变化。同时你已经把prev->next指向了cur->next,断开了原链表中cur的连接,所以外部遍历链表时就找不到cur节点了,误以为被删除。

两种修正方式

方式一:传递头指针的指针(二级指针)

把函数参数改成二级指针,直接修改外部头指针的地址:

void FindPrintMove(NODE **start, int index) {
    int size = 1;  // 索引从1开始符合程序要求
    NODE *cur = *start;
    NODE *prev = NULL;
    while (cur != NULL) {
        if (size == index) {
            //printf("%s", cur->word);
            if (prev == NULL) {
                break; // 已经在头部,无需移动
            } else {
                prev->next = cur->next;
                cur->next = *start;
                *start = cur; // 直接修改外部传入的头指针
                break;
            }
        }
        size++;
        prev = cur;
        cur = cur->next;
    }
}

调用时传入头指针的地址:

FindPrintMove(&your_head_pointer, target_index);

方式二:让函数返回新的头指针

修改函数返回值为NODE*,返回移动后的新头指针,外部用原头指针接收:

NODE* FindPrintMove(NODE *start, int index) {
    int size = 1;
    NODE *cur = start;
    NODE *prev = NULL;
    while (cur != NULL) {
        if (size == index) {
            //printf("%s", cur->word);
            if (prev == NULL) {
                return start; // 已在头部,返回原头
            } else {
                prev->next = cur->next;
                cur->next = start;
                return cur; // 返回新的头指针
            }
        }
        size++;
        prev = cur;
        cur = cur->next;
    }
    return start; // 未找到对应索引,返回原头
}

调用时更新头指针:

your_head_pointer = FindPrintMove(your_head_pointer, target_index);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:40:29