25. K 个一组翻转链表
题目
K 个一组翻转链表题目
变式:不足k个也反转,见代码注释
方法思路
- 单链表反转的综合运用
- 具体看代码注释
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
// 对k个结点进行反转,并将下一组k个结点的头节点放在nextHead中
ListNode* f(ListNode* head, ListNode*& nextHead, int k) {
ListNode* pre = nullptr;
ListNode* cur = head;
while (k--) {
ListNode* post = cur->next;
cur->next = pre;
pre = cur;
cur = post;
}
nextHead = cur;
return pre;
}
ListNode* reverseKGroup(ListNode* head, int k) {
// 使用sz记录链表的长度
int sz = 0;
ListNode* p = head;
while (p) {
p = p->next;
sz++;
}
// 创建一个虚拟头节点
ListNode* newHead = new ListNode(0);
p = newHead;
ListNode* q = head;
// 将链表中满足k个节点的子链表反转
for (int i = 0; i < sz / k; i++) {
// tail记录反转k个结点后的尾结点
ListNode* tail = q;
// nextNode记录下一个k个节点的头节点
ListNode* nextNode = nullptr;
// f返回反转后的头节点
p->next = f(q, nextNode, k);
// p更新为尾结点
p = tail;
p->next = nullptr;
// q更新为下一组k个节点的头节点
q = nextNode;
}
// 在将不足k个结点的链表直接连接
p->next = q;
// // 如果题目为不足k个也反转
// ListNode* pre = nullptr;
// ListNode* cur = q;
// while (cur) {
// ListNode* post = cur->next;
// cur->next = pre;
// pre = cur;
// cur = post;
// }
// p->next = pre;
ListNode* ans = newHead->next;
delete newHead;
return ans;
}
};
官方题解:K 个一组翻转链表题解