![30541d1d5541b2ac44af5d59bcb735f0.png](https://i-blog.csdnimg.cn/blog_migrate/84e7656e60fab61d89837c7cc2a5105c.jpeg)
题目链接:
K 个一组翻转链表 - 力扣(LeetCode)leetcode-cn.com![fbca7c15f0b7694af839603eed48d931.png](https://i-blog.csdnimg.cn/blog_migrate/c241cfa1fa69c016bac294c6156a409a.jpeg)
题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路:
本题是反转链表 II的升级版,每隔 k 个节点反转一次,最后不到 k 个节点不用反转。那很自然的一个思路就是,先求出链表的长度,我们就可以知道要把链表分成几段,然后分别进行反转,最后剩下的不到 k 个节点不用管就行。
具体实现的时候,反转的代码和反转链表 II没有啥区别,注意在外层循环里要重置 pre 和 head 的位置就行。
代码如下:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *dummy = new ListNode(0), *pre = dummy;
dummy->next = head;
ListNode *p = head;
int len = 0;
while (p) {
len++;
p = p->next;
}
for (int i = 0; i < len / k; i++) {
for (int j = 1; j < k; j++) {
ListNode* temp = pre->next;
pre->next = head->next;
head->next = head->next->next;
pre->next->next = temp;
}
pre = head;
head = head->next;
}
return dummy->next;
}
};
如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。