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

牛群的重新分组

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

知识点

链表,反转链表

解题思路

大致的思路是找出链表的总节点数n,分为n/k个模块分别将链表倒转。

具体做法:定义一个ans虚拟节点next指向head,pre节点等于ans,curr等于head。

在循环中next为curr的下一个节点,curr的next指向next.next,next.next指向pre.next。pre的next指向next。

在循环外pre等于curr,curr下一一位。画个k=3的草图就是这样。

Java题解

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) {
        // write code here
        ListNode ans = new ListNode(0);
        ans.next = head; //构建一个新节点
        int n = 0; //结点的总数
        ListNode curr = head;
        while(head != null){
            head = head.next;
            n++;
        }
        ListNode pre = ans; //循环中的前置结点
        for(int i = 0; i < n/k; i++){ //分模块倒转链表
            for(int l = 1; l < k; l++){ //一个模块中的链表
                ListNode next = curr.next;
                curr.next = next.next; //必然不会报空指针,因为k=1不会走到这儿
                next.next = pre.next; //倒转
                pre.next = next;
            }
            pre = curr;
            curr = curr.next;
        }
        return ans.next;
    }
}

全部评论

相关推荐

SHC2:关键问题是你这三段实习是三个不同的岗位…你这样子秋招就是只有一段实习的本科生..
点赞 评论 收藏
分享
牛客33727151号:不是哥们我以为驾照是段子呢
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务