Problem :将一个有序list划分为k个组,并且每个组的元素逆置
链表操作 :递归算法
每次寻找到该组的尾部,然后进行逆置操作,返回头部,这样每次递归操作之后能够进行下一次的逆置操作。
链表操作画图比较形象!!!!
对于递归算法:找到共同点,找到程序退出点,注意特殊情况
本题中,共同点为每组为k个节点,并且每组进行的操作均为逆置操作。
程序退出点,每次返回逆置后的头部,这样最终结果为头部
特殊情况:该链表中的节点个数不是k的整数倍,最后剩下的不需要进行逆置操作!!
参考代码:
package leetcode_50; /*** * * @author pengfei_zheng * list划分为k组并且逆置 */ public class Solution25 { public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode reverseKGroup(ListNode head, int k) { ListNode curr = head; int count = 0; while (curr != null && count != k) { // find the k+1 node curr = curr.next; count++; } if (count == k) { // if k+1 node is found curr = reverseKGroup(curr, k); // reverse list with k+1 node as head // head - head-pointer to direct part, // curr - head-pointer to reversed part; while (count-- > 0) { // reverse current k-group: ListNode tmp = head.next; // tmp - next head in direct part head.next = curr; // preappending "direct" head to the reversed list curr = head; // move head of reversed part to a new node head = tmp; // move "direct" head to the next node in direct part } head = curr; } return head; } }