题目连接:链表中的节点每k个一组翻转_牛客题霸_牛客网 (nowcoder.com)
题目描述:
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k=2 , 你应该返回 2→1→4→3→5
对于k=3 , 你应该返回 3→2→1→4→5
题目解析:
#include "stdio.h"
#include "stdlib.h"
/*
BM3 链表中的节点每k个一组翻转
描述
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k = 2 , 你应该返回 2→1→4→3→5
对于 k = 3 , 你应该返回 3→2→1→4→5
*/
/**************************code*****************************************/
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* reverse(struct ListNode* head, int k){
struct ListNode *cur, *next, *pre;
pre = NULL, cur = head, next = head->next;
while(k--){
cur->next = pre;
pre = cur;
cur = next;
next = next->next;
}
return pre;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
// write code here
struct ListNode* dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode));
dummyHead->next = head;
struct ListNode* revHead, *revEnd;
int count = 0;
revHead = dummyHead, revEnd = dummyHead->next; //head表示反转区间前一个节点,end表示反转区间后一个节点
if(k == 1) //如果k=1,则直接返回
return dummyHead->next;
while(revEnd){ //寻找区间节点过程中,如果区间后的节点不存在,则直接退出
revEnd = revEnd->next; //存在则指向下一个
if(++count == k){ //如果找到一个满足k的区间,则开始反转
revHead->next = reverse(revHead->next, k); //区间前一个节点的next 为 反转后链表
while(count--){ //找到反转后的链表的 区间的末尾节点
revHead = revHead->next;
}
revHead->next = revEnd; //此时head为反转好的区间的末尾节点,next指向之前保存的反转区间的后一个节点,
//同时revHead处于下一区间的前一个节点。[2 1(head)] [3 4]
count = 0; //count置0
}
}
return dummyHead->next;
}
/**************************end******************************************/
int main ()
{
struct ListNode LN15={5,NULL};
struct ListNode LN14={4,&LN15};
struct ListNode LN13={3,&LN14};
struct ListNode LN12={2,&LN13};//k=2 {2 1 4 3 5}
struct ListNode LN1 ={1,&LN12};//k=3 {3 2 1 4 5}
struct ListNode LN2 = {NULL,NULL}; //k=1 {}
struct ListNode LN3 = {NULL,NULL};
struct ListNode LN4 = {NULL,NULL};
struct ListNode *pLN = reverseKGroup(&LN1, 2);
return 0;
}