题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

分段头插法进行每k组的翻转,先把剩余的那部分不用翻转的子链表摘出来,然后再将需要翻转的部分分段翻转,最后将摘出来的部分链表连接到已经翻转好的子链表中。

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        if (head == null || k == 1){
            return head;
        }

        ListNode p = head;
        int num = 0;

        while (p != null){
            p = p.next;
            num ++;
        }

        if (num < k){
            return head;
        }
        p = head;

        int reverseNum = (num - num % k);
        reverseNum --;
        while (reverseNum != 0){

            reverseNum --;
            p = p.next;
        }

        ListNode withoutRe = p.next;
        p.next = null;
        ListNode newNode = new ListNode(-1);
        ListNode curHead = newNode;
        p = head;
        int count = 0;

        while (p != null){

            if (count > 0 && count % k == 0){
                int c = k;
                while (c != 0){
                    c --;
                    curHead = curHead.next;
                }
            }

            ListNode temp = p;
            p = p.next;
            temp.next = curHead.next;
            curHead.next = temp;
            count ++;
        }
        p = newNode;
        while (p.next != null){
            p = p.next;
        }
        p.next = withoutRe;

        return newNode.next;
    }
}
全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务