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

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

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

问题反省:

链表的问题,为什么很顽固,究根问底还是自己对于一些细节和知识的掌握不牢固,甚至有模凌两可的情况出现,比如下面的,

这个for(int i=0; i<k; i++) {

// 循环体

}

这个理解就不到位,会导致具体代码会遍历到那个节点,逻辑判断和执行的时候,自己有点懵圈了,其实实际情况是这样的。

整个for循环,可以分成三部分:

for(表达式1;表达式2;表达式3){

// 循环体

}

第1次执行的过程是: 表达式1->表达式2->循环体->表达式3

第2次到最后前一次的执行过程是:表达式2->循环体->表达式3

最后一次的执行过程是:表达式2 停止了

所以,可以总结的一个过程是, 12循3,2循3,2完!

具体参考:https://blog.csdn.net/weixin_42295859/article/details/114044468

解题思路:链表反正+递归

1、首先,利用一个for循环,找到下k个翻转链表的头,也就是当前链表的尾部。

2、之后,反转当前链表,因为下个链表头知道了,就不怕断链

3、最后,把当前的链表尾,也就是旧的head.next指向下个反转链表的头。

import java.util.*;

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

public class Solution {
    /**
     * 链表中的节点每k个一组翻转
     * @param head ListNode类
     * @param k int整型
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // 找到链表尾,也就是下k个反转链表的头
        ListNode tail = head;
        for(int i=0; i<k; i++) {
            if(tail == null) {
                return head;
            }
            tail = tail.next;
        }

        // 反转当前段的链表
        ListNode prev = null;
        ListNode curr = head;
        while(curr!=tail) {
            ListNode temp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = temp;
        }

        // 把下个翻转的链表头赋值给当前的空链表尾
        head.next = reverseKGroup(tail, k);
        return prev;
    }
     


}
全部评论

相关推荐

ResourceUtilization:差不多但是估计不够准确,一面没考虑到增长人口,另一方面也没考虑到能上大学的人数比例,不过我猜肯定只多不少
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务