给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/*
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//反转区间[a,b)的元素
ListNode* reverse(ListNode* a,ListNode* b){
ListNode *pre, *cur, *nxt;
pre = NULL; cur = a; nxt = a;
while(cur != b){
nxt = cur->next;
cur->next = pre;
pre = cur;
cur = nxt;
}
//返回反转后的头结点
return pre;
}
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(head == NULL)
return NULL;
//区间[a,b)包含k个待反转元素
ListNode *a, *b;
a = b = head;
for(int i = 0;i < k;i++){
//不足k个的不需要反转
if(b == NULL)
return head;
b = b->next;
}
//反转前k个元素
ListNode* newHead = reverse(a,b);
//递归反转后续链表并连接起来
a->next = reverseKGroup(b,k);
return newHead;
}
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *guard = new ListNode(0);
guard->next = head;
head = guard;
while(1){
int node_nums = 0;
ListNode *last = head->next;
for(int i = 0;i < k;i ++){
if(last == NULL)
break;
node_nums++;
last = last->next;
}
if(node_nums < k)
break;
ListNode *first = head->next;
for(int j = 0;j < k;j ++){
ListNode *aim = first;
int index = k - j - 1;
while(index--)
aim = aim->next;
head->next = aim;
head = aim;
}
head->next = last;
}
return guard->next;
}
};
来源:CSDN
作者:sjFu1412
链接:https://blog.csdn.net/weixin_45333771/article/details/104214952