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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:24:02