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

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

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

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
        // 通过递归的思路:将反转的几个子区间每个当作一个递归来做
        // 每次找到一个子区间的尾部,当作反转的终止条件
        // 然后对每个子区间使用头插法插入,长度不足k的子区间直接返回head

        // 每次找到反转区间的尾部
        ListNode tail = head;

        // 遍历k次到区间尾部
        for(int i=0; i<k; i++) {
            // 如果不足k次就到了链表尾,直接返回head,不反转
            if(tail == null){
                return head;
            }
            // tail 后移
            tail = tail.next;
        }


        // 翻转时需要前序和当前结点
        ListNode pre = null;
        ListNode cur = head;

        // 在达到当前段尾结点前
        while(cur != tail) {
            // 翻转
            ListNode temp = cur.next;  // 防断链
            cur.next = pre;   // 新遍历到的结点指向头
            pre = cur;   // 令pre为头指针
            cur = temp;  // 遍历下标后移
        }
        // 当前尾指针指向下一个子区间头部
        // 因为反转了,所以head跑最尾部了
        head.next = reverseKGroup(tail, k);
        return pre;
    }
}

全部评论

相关推荐

07-07 12:47
门头沟学院 Java
码农索隆:竟然还真有卡体检报告的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务