25. Reverse Nodes in k-Group
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
// 解题思路 // 将链表分割成n个共k个元素的小段,对每一小段进行反向处理,最后一个小段若不满k个元素,则不进行反向处理 // 1)判断每一个小段是否有k个元素 ps:其实只有最后一小段可能不满k个元素,但由于无法判断是否到达最后一个小段,故对每个小段都判断是否有k个元素,若不满k个元素,即到达最后一个小段,也不反向处理 int count = 0; ListNode temp = pre; while(count<k&&temp!=null){ ++count; temp = temp.next; } if(count!=k)break; // 2)反向处理:对于每一个小段,将其分为两个部分,即待处理片段和已处理片段;待处理片段的第一个元素总是和已处理片段的最后一个元素相连,且待处理片段的第一个元素准备向已处理片段的第一个前面插入;由于该操作执行后,待处理片段的第一个元素要与其后的待处理元素断开联系,故在执行该操作前,必须先让已处理片段的最后一个元素与其之后的待处理元素相连。 //令pre指向已处理片段最后一个元素,curr指向已处理片段第一个元素,post指向待处理片段第一个元素 for(int i=1;i<k;++i){ pre.next = post.next; post.next = curr; curr = post; post = pre.next; } // 3)在每个小段处理完毕后,指针需后移指向下一个分组,此时须主意使上一个分组的已处理片段的最后一个元素与后一个分组的已处理片段的第一个元素相连接。 if(lastpre==null)head = curr; else lastpre.next = curr; lastpre = pre; pre = pre.next; curr = pre; post = pre.next;
原文:https://www.cnblogs.com/dmzxxmeng/p/10865037.html