C++ 如何通过修改指针而非新建节点替换链表指定索引位置的元素
链表节点交换实现方案(仅修改指针无新节点创建)
现有代码的核心问题
- 第二个循环逻辑完全无效:函数参数中的
head是指针值传递的副本,修改该局部变量的指向不会对函数外的原链表产生任何作用,反复赋值head = temporaryTwo/One没有实际意义 - 缺少前驱节点记录:交换链表节点不仅需要修改两个目标节点本身的指针,还需要修改两个节点各自前序节点的
next指向,你现有代码完全没有捕获前驱节点信息,无法完成完整的链表结构修改 - 无边界场景处理:没有考虑两个索引相等、其中一个节点是头节点、两个节点相邻等特殊场景,运行时大概率出现断链或者空指针异常
具体实现代码
场景1:仅交换节点存储的数值,不修改链表结构
如果你的需求只是替换两个位置的元素值,不需要调整节点在链表中的位置,代码可以非常简洁,仅需一次遍历找到两个节点后交换值即可:
void replaceValues(Node* head, int indexOne, int indexTwo) { // 索引相同或链表为空直接返回 if (indexOne == indexTwo || head == NULL) return; Node *node1 = NULL, *node2 = NULL, *current = head; int count = 0; while (current != NULL) { if (count == indexOne) node1 = current; if (count == indexTwo) node2 = current; count++; current = current->next; } // 两个节点都存在才交换值 if (node1 != NULL && node2 != NULL) { int temp = node1->val; node1->val = node2->val; node2->val = temp; } }
场景2:交换节点本身的位置,仅修改指针不改动节点值
如果要求必须调整节点的链表位置、只修改指针,需要额外记录两个节点的前驱节点,同时支持头节点修改的场景需要用二级指针传参:
// 参数用二级指针,支持头节点修改的场景 void swapNodes(Node** head, int indexOne, int indexTwo) { if (indexOne == indexTwo || *head == NULL) return; Node *prev1 = NULL, *node1 = NULL; Node *prev2 = NULL, *node2 = NULL; Node* current = *head; int count = 0; // 一次遍历同时找到两个目标节点和对应的前驱节点 while (current != NULL) { if (count == indexOne) node1 = current; if (count == indexTwo) node2 = current; // 未找到对应节点时记录前驱 if (node1 == NULL) prev1 = current; if (node2 == NULL) prev2 = current; count++; current = current->next; } // 任意索引非法直接返回 if (node1 == NULL || node2 == NULL) return; // 第一步:修改两个前驱节点的next指向 if (prev1 != NULL) { prev1->next = node2; } else { // node1是原头节点,更新头指针 *head = node2; } if (prev2 != NULL) { prev2->next = node1; } else { // node2是原头节点,更新头指针 *head = node1; } // 第二步:交换两个节点自身的next指向 Node* temp = node1->next; node1->next = node2->next; node2->next = temp; }
如果不想使用二级指针,也可以把函数返回值改为Node*类型,返回交换后的新头节点,调用方接收返回值更新原链表头即可。
内容的提问来源于stack exchange,提问作者Ukrainis
相关产品推荐
相关产品推荐

