如何在C++中实现链表首节点移至尾部的rotate函数?
实现链表首节点移到尾部的
rotate函数 咱们先把这个旋转操作的核心逻辑理清楚,再一步步写代码实现,刚好适配你已经搭建好的"Hello+"链表场景。
先处理边界情况
首先得考虑两种不需要折腾的场景:
- 链表本身是空的(
head为NULL) - 链表只有一个节点(
head->next为NULL)
这两种情况直接返回就好,避免后续操作出问题。
核心逻辑拆解
要完成"首节点移到尾部",其实就四步:
- 保存原头节点:把当前的头节点存起来(比如叫
old_head),后面要把它接到尾部。 - 更新头节点:把链表的
head指向原头节点的下一个节点,相当于把原头节点从头部"摘"下来。 - 找到尾节点:遍历整个链表,直到找到
next为NULL的节点,也就是链表的最后一个节点。 - 把原头节点接去尾部:让尾节点的
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
相关产品推荐
相关产品推荐

