本文共 1609 字,大约阅读时间需要 5 分钟。
给你一个链表,每 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;}