You need to enable JavaScript to run this app. C语言单链表节点移动问题:如何实现节点向前移动到指定位置
优惠活动
大模型
产品
解决方案
定价
更多

C语言单链表节点移动问题:如何实现节点向前移动到指定位置

单链表节点向前移动实现方案

逻辑说明

你当前的向后移动逻辑是每次将目标节点与后一个节点交换,重复N次到达目标位置。向前移动可以复用相同的思路:每次将目标节点与前一个节点交换,重复pos - index次即可,唯一需要额外处理的是头节点变更的场景。
另外你现有代码的向后移动循环缺少指针更新逻辑,运行会出现逻辑错误,可同步修正。

完整修改后的代码

FrameNode* MovePos(FrameNode* list, int number_of_nodes)
{
    char name[STR_LEN] = { 0 };
    int index = 0, pos = 1;
    bool flage = false;
    printf("Enter the name of the frame\n");
    fgets(name, STR_LEN, stdin);
    name[strcspn(name, "\n")] = 0;
    flage = searchInList(list, name); // 查找帧是否存在的函数
    if (!flage)
    {
        return list;
    }
    printf("Enter the new index in the movie you wish to place the frame\n");
    do
    {
        scanf("%d", &index);
        getchar();
        if (index > number_of_nodes || index < 1)
        {
            printf("please enter number between 1-%d\n", number_of_nodes);
        }
    } while (index > number_of_nodes || index < 1);
    FrameNode* p = list;
    FrameNode* prev = p;
    while (strcmp(p->frame->name, name))
    {
        prev = p;
        p = p->next;
        pos++;
    }
    // 位置相同直接返回
    if (pos == index)
    {
        return list;
    }
    // 向后移动逻辑修正
    for (int i = pos; i < index; i++)
    {
        FrameNode* next_node = p->next;
        prev->next = next_node;
        p->next = next_node->next;
        next_node->next = p;
        // 更新前驱指针,为下一次交换做准备
        prev = next_node;
    }
    // 向前移动逻辑实现
    for (int i = pos; i > index; i--)
    {
        FrameNode* pre_prev = list;
        // 要交换的前驱节点是头节点,交换后目标节点变为新头
        if (pre_prev == prev)
        {
            prev->next = p->next;
            p->next = prev;
            list = p;
            prev = p;
        }
        else
        {
            // 找到前驱节点的上一级节点
            while (pre_prev->next != prev)
            {
                pre_prev = pre_prev->next;
            }
            // 交换目标节点和前驱节点的位置
            pre_prev->next = p;
            prev->next = p->next;
            p->next = prev;
            // 更新前驱指针,为下一次交换做准备
            prev = pre_prev;
        }
    }
    return list;
}

注意事项

  • 新增了index合法性判断,避免输入小于1的无效值
  • 头节点变更逻辑已处理,调用该函数后需要用返回值更新原链表的头指针
  • 目标节点本身就在目标位置的场景做了提前返回优化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 08:45:04