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

