题解 | #牛群的重新分组#

牛群的重新分组

https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93

  1. 题目考察的知识点

链表的反转操作

  1. 题目解答方法的文字分析

通过链表长度len和K值确定需要反转的结点数,即len/k为要反转的组数,(len/k)*k为要反转的节点数,剩下的就是不需要翻转,直接链接到新链表末尾即可。 每K个反转成新链表,把每个新链表的head保存到List中.需要反转的结点数已到并且剩下的结点数不足K个,不反转,即把当前结点存到List中。最后把List中各个链表连接形成答案。

  1. 本题解析所用的编程语言

java

  1. 完整且正确的编程代码
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

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 len = 0;
        while (p != null) {
            len++;
            p = p.next;
        }

        ListNode reverseListHead = null;
        ListNode curNode = head;
        ListNode preNode = null;
        ListNode nextNode = null;
        //List存放各链表头结点
        List<ListNode> list = new ArrayList<ListNode>();

        //count 计数器 记录k个元素,每k个重新置1
        int count = 1;
        //需要发生反转的结点个数
        int reverseNum = (len / k) * k;
        while (curNode != null) {

            nextNode = curNode.next;

            if ( count <= k) {

                if (count == k) {

                    reverseListHead = curNode;
                    list.add(reverseListHead);
                    count = 1;

                    curNode.next = preNode;
                    preNode = null;
                    curNode = nextNode;
                } else {
                    count++;

                    curNode.next = preNode;
                    preNode = curNode;
                    curNode = nextNode;
                }
            }

            if (reverseNum == 1 && count != k) {
                list.add(curNode);
                break;
            }

            reverseNum--;

        }
        ListNode newHead = list.get(0);

        for (int i = 0; i < list.size() - 1; i++) {
            p = list.get(i);
            while (p.next != null) {
                p = p.next;
            }
            p.next = list.get(i + 1);

        }

        return newHead;

    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 15:46
已编辑
字节国际 电商后端 24k-35k
点赞 评论 收藏
分享
面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务