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
相关产品推荐
相关产品推荐

