题目链接:25. K 个一组翻转链表 - 力扣(LeetCode)
递归+迭代,迭代翻转每组的链表节点,递归翻转下一组的链表节点
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode*nextHead=head; // 下一组的头部
for(int i=0;i<k;i++){ // 先计算下一组的头部,不够就直接返回
if(!nextHead)
return head;
nextHead=nextHead->next;
}
ListNode*curr=head->next;
head->next= reverseKGroup(nextHead,k); // 翻转下一组,接到当前组的后面
while(--k){ // 第一个节点已经确定尾部
ListNode*next=curr->next; // 记录下一个的位置
curr->next=head; // 把前一个节点放到当前节点的后面
head=curr; // 更新当前节点为前一个节点
curr=next; // 更新下一个节点为当前节点
}
return head; // 返回当前组最后一个节点
}
};
字节二面变种,小于k个也翻转
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int value;
Node* next;
};
Node* vectorToList(vector<int> nums) {
if (nums.empty())
return nullptr;
Node* head = new Node{nums[0], nullptr};
Node* cur = head;
for (int i = 1; i < nums.size(); ++i) {
cur->next = new Node{nums[i], nullptr};
cur = cur->next;
}
return head;
}
Node* reverseK(Node* head, int k) {
if (head == nullptr)
return nullptr;
Node* newHead = head;
for (int i = 0; i < k; ++i) {
if (newHead == nullptr)
return reverseK(head, i);
newHead = newHead->next;
}
Node* cur = head->next;
head->next = reverseK(newHead, k);
while (--k) {
Node* next = cur->next;
cur->next = head;
head = cur;
cur = next;
}
return head;
}
void showList(Node* head) {
while (head) {
cout << head->value << ' ';
head = head->next;
}
}
int main() {
vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8};
Node* list = vectorToList(nums);
list = reverseK(list, 3);
showList(list);
return 0;
}