Reverse Nodes in k-Group(K组翻转链表)

http://www.lintcode.com/en/problem/reverse-nodes-in-k-group/?rand=true

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */


public class Solution {
    /*
     * @param head: a ListNode
     * @param k: An integer
     * @return: a ListNode
     */
    public ListNode reverseKGroup(ListNode head, int k) {
        // write your code here
        //new 一个节点可以完美处理头节点的问题
        ListNode node = new ListNode(0);
        node.next = head;
        head = node;
        tag:
        while (head != null) {
            int i = k;
            //temp记录当前节点
            ListNode temp = head;
            //循环k次,判断有没有k个节点
            while (i > 0) {
                //因为上边指向head,是k个节点的前一个。所以先向后偏移,然后判断和--;
                temp = temp.next;
                if (temp == null) {
                    //使用标记来跳出外循环。
                    break tag;
                }
                i--;
            }
            //记录这k个节点的翻转后的头节点 
            ListNode newHead = head.next;
            //记录这k个节点的翻转后的尾节点,其实就是第一个节点,翻转之后就是最的一个。 
            ListNode tail = head.next;
            //temp记录需要翻转的节点位置
            temp = newHead.next;
            //因为temp是从第二个开始,第一个不需要翻转,所以要k-1;
            i = k - 1;
            //完成翻转
            while (i > 0) {
                ListNode next = temp.next;
                temp.next = newHead;
                newHead = temp;
                temp = next;
                i--;
            }
            //前边的节点指向新的头节点
            head.next = newHead;
            //新的尾节点把向后边的节点
            tail.next = temp;
            //偏移k位
            head = tail;
        }
        return node.next;
    }
}

你可能感兴趣的:(Reverse Nodes in k-Group(K组翻转链表))