来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
单链表结构如下:
struct ListNode {
int val;
struct ListNode* next;
};
解题思路如下图所示:
代码如下:
struct ListNode* reverseKGroup(struct ListNode* head, int k){
if (head == NULL || head->next == NULL || k == 1) return head;
struct ListNode* p = head;
int len = 0;
while (p)
{
len += 1;
p = p->next;
}
if (len < k) return head;
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = head;
head = p;
struct ListNode* ps = head;
struct ListNode* tail = NULL;
p = head->next;
int n = len / k;
for (int i = 0; i < n; i++)//逆置组数
{
tail = p;
p = p->next;
ps->next = tail;
tail->next = NULL;
for (int j = 0; j < k - 1; j++)//每次要逆置的次数
{
struct ListNode* s = p;
p = p->next;
s->next = ps->next;
ps->next = s;
}
ps = tail;
}
tail->next = p;
p = head;
head = head->next;
free(p);
return head;
}