c 语言 leetcode k个一组翻转链表
题目
给你一个链表,每 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案
/*翻转链表*/
struct LinkNode* reversal(struct LinkNode* head){
if(head == NULL){
return head;
}
struct LinkNode* pre = (struct LinkNode* )malloc(sizeof(struct LinkNode));
pre -> next = NULL;
while(head){
struct LinkNode* next = head -> next;
head -> next = pre -> next;
pre -> next = head;
head = next;
}
struct LinkNode* ret = pre -> next;
free(pre);
return ret;
}
struct LinkNode* reversalKList(struct LinkNode* head,int k ){
//创建一个哑结点 ret (不存数据的头结点)
struct LinkNode* ret =(struct LinkNode*)malloc(sizeof(struct LinkNode));
struct LinkNode* pre = NULL;
pre = ret;
pre -> next = head;
struct LinkNode* tail = NULL;
tail = pre;
int i = 0;
while(tail){
for(i = 0; i < k ; i++){//进行分组
tail = tail->next;
if(!tail){ //如果tail == NULL 直接返回不需要在翻转
return ret.next;
}
}
//updateHead 保存 这个头结点
struct LinkNode* updateHead = NULL;
updateHead = pre->next;
//temp 保存 k个节点之后的那个节点
struct LinkNode* temp = NULL;
temp = tail ->next;
//k个节点链表的终止条件
tail -> next = NULL;
//pre -> next 等于 翻转后的头结点
pre -> next = reversal(updateHead);
//翻转后updateHead 就是k个节点的尾节点
//链接下一个的k个节点的头结点
updateHead -> next = temp;
//计算下一组
pre = updateHead ;
tail = pre;
}
return ret.next;
}