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

C++列表元素上移实现:shift_back函数编写方法问询

单链表指定位置元素上移实现方案

前提说明

首先明确单链表的节点结构,通常定义如下(数据域类型可根据实际需求修改):

typedef struct item {
    int data;
    struct item* next;
} item;

注:你给出的函数返回值类型items*疑似笔误,以下实现默认修正为item*(若确实为自定义链表头结构,可按需调整)。

功能分析

所谓“指定位置元素上移”,指将链表中第i个位置的节点(以下假设位置从0开始计数)与它的前驱节点交换位置;若该节点已是头节点或位置非法,则直接返回原链表。

代码实现

item* shift_back(item* head, int i) {
    // 边界情况:链表为空、目标是头节点或位置小于0,直接返回原头
    if (head == NULL || i <= 0) {
        return head;
    }

    item* prev_prev = NULL; // 目标节点前驱的前驱节点
    item* prev = head;      // 目标节点的前驱节点
    item* curr = head->next;// 目标节点

    // 遍历找到第i个节点及其前后关联节点
    int count = 1;
    while (curr != NULL && count < i) {
        prev_prev = prev;
        prev = curr;
        curr = curr->next;
        count++;
    }

    // 若i超出链表实际长度,直接返回原头
    if (curr == NULL) {
        return head;
    }

    // 调整指针完成节点上移
    prev->next = curr->next;
    curr->next = prev;
    // 若前驱节点是原头节点,更新链表头指针
    if (prev_prev == NULL) {
        head = curr;
    } else {
        prev_prev->next = curr;
    }

    return head;
}

关键逻辑说明

  • 边界处理:先过滤无需操作的场景,避免无效遍历。
  • 节点定位:通过遍历找到目标节点curr、它的前驱prev以及前驱的前驱prev_prev,这三个节点是指针调整的核心。
  • 指针调整:先让前驱节点跳过目标节点,再让目标节点指向前驱节点,最后根据前驱节点是否为头节点,决定是否更新链表头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:52:24