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

如何在C++中实现链表首节点移至尾部的rotate函数?

实现链表首节点移到尾部的rotate函数

咱们先把这个旋转操作的核心逻辑理清楚,再一步步写代码实现,刚好适配你已经搭建好的"Hello+"链表场景。

先处理边界情况

首先得考虑两种不需要折腾的场景:

  • 链表本身是空的(head为NULL)
  • 链表只有一个节点(head->next为NULL)
    这两种情况直接返回就好,避免后续操作出问题。

核心逻辑拆解

要完成"首节点移到尾部",其实就四步:

  1. 保存原头节点:把当前的头节点存起来(比如叫old_head),后面要把它接到尾部。
  2. 更新头节点:把链表的head指向原头节点的下一个节点,相当于把原头节点从头部"摘"下来。
  3. 找到尾节点:遍历整个链表,直到找到next为NULL的节点,也就是链表的最后一个节点。
  4. 把原头节点接去尾部:让尾节点的next指向old_head,再把old_head的next设为NULL,这样它就变成新的尾节点了。

具体代码实现(在list.h中)

假设你的链表结构是这样定义的(如果和你的实际结构有出入,对应调整字段名即可):

// 链表节点结构
typedef struct Node {
    char data;
    struct Node* next;
} Node;

// 链表整体结构
typedef struct List {
    Node* head;
} List;

那rotate函数可以这么写:

void rotate(List* list) {
    // 边界情况判断:链表为空、只有一个节点,或者传入的链表指针为空
    if (list == NULL || list->head == NULL || list->head->next == NULL) {
        return;
    }

    // 1. 保存原来的头节点
    Node* old_head = list->head;
    // 2. 更新链表头为原头节点的下一个节点
    list->head = old_head->next;

    // 3. 遍历找到链表的尾节点
    Node* tail = list->head;
    while (tail->next != NULL) {
        tail = tail->next;
    }

    // 4. 将原头节点接到尾部,并设置它为新的尾节点
    tail->next = old_head;
    old_head->next = NULL;
}

适配你的场景验证

你已经把"Hello"的每个字符和"-"放进链表了,初始结构是:H -> e -> l -> l -> o -> - -> NULL。调用rotate之后,链表会变成:e -> l -> l -> o -> - -> H -> NULL,完全符合你要的首节点移到尾部的效果。

优化小技巧

如果你的链表结构体里维护了尾节点指针(比如struct List里加个Node* tail),那可以省去遍历找尾节点的步骤,把时间复杂度从O(n)降到O(1),代码更高效:

void rotate(List* list) {
    if (list == NULL || list->head == NULL || list->head == list->tail) {
        return;
    }

    Node* old_head = list->head;
    list->head = old_head->next;
    list->tail->next = old_head;
    list->tail = old_head;
    old_head->next = NULL;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:46:56