🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️
本博客致力于分享知识,欢迎大家共同学习和交流。
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
翻转局部再递归
流程:
1、先判断链表是不是空 || k是不是1,如果是,直接返回头节点。
2、设置指向当前头节点的临时节点current,current遍历链表计算长度,若长度小于k则无法翻转,返回当前头节点,向上归。否则向下进行。
3、对k个节点进行翻转,先记录一下头节点head,
这里我们单独写一个函数reverseList(ListNode* head,int k),进行k个节点的翻转(需要避免链表成环);
4、reverse了前k个节点,记录一下新的头节点newHead,head变成了第k个节点
此时current指向了第k+1个节点,向下传递翻转后续k个节点,head->next=reverseList(current,k)。
5、返回我们的新的头节点newHead
代码实现:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
// 无法翻转,返回头节点
if (head == nullptr || k == 1)
return head;
// 设置计数器求长度
int count = 0;
// 指向当前节点
ListNode* current = head;
// 遍历链表
while (current != nullptr && count < k) {
current = current->next;
count++;
}
// 向上归
if (count < k)
return head;
// 向下递
ListNode* newHead = reverseList(head, k);
head->next = reverseKGroup(current, k);
return newHead;
}
ListNode* reverseList(ListNode* head, int k) {
if (head == nullptr || k == 1)
return head;
ListNode* prev = nullptr;
ListNode* current = head;
ListNode* next = nullptr;
while (current && k > 0) {
next = current->next;
current->next = prev;
prev = current;
current = next;
k--;
}
return prev;
}
};