25. K 个一组翻转链表
Posted lancelee98
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了25. 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution { public: //返回下一个开始的结点 //flag记录是如何切完的 若按size切完 则flag=1 //若切出来的部分不足size flag=0 ListNode* cut(ListNode* start, int size,int& flag) { if (!size)return NULL; ListNode* p = start; while (p&& --size) p = p->next; if (size)flag = 0; else flag = 1; if (!p)return NULL; ListNode* res = p->next; p->next = NULL; return res; } ListNode* my_reverse(ListNode* head) { if (!head || !head->next)return head; ListNode* p = head,*q=p->next,*next_node=NULL; p->next = NULL; while (q) { next_node = q->next; q->next = p; p = q; if (!next_node)return q; q = next_node; } return NULL;//这句无意义 } //对每组调用my_reverse函数进行反转 ListNode* reverseKGroup(ListNode* head, int k) { int flag = 1; ListNode* newhead = new ListNode(0, head); ListNode* p = newhead; ListNode* start = head; ListNode* next_start = cut(start, k,flag); while (next_start) { p->next = my_reverse(start); while (p->next)p = p->next; start = next_start; next_start = cut(start, k,flag); } if (start && flag)p->next = my_reverse(start); else p->next = start; return newhead->next; } };
以上是关于25. K 个一组翻转链表的主要内容,如果未能解决你的问题,请参考以下文章