Java同学的面试算法学习 1

64 阅读1分钟

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

题目描述

image-20231222210541736

思路

递归解法

先循环k次找到tail进行分组切段,每次先找到新的一段的tail作为下一次操作的head,反转每一小段,然后连接好后面反转好的链表

步骤

  1. 循环遍历新的小段k次找到tail,判断新的头结点head是否可以能循环k次得到tail即能够得到新的小段,得不到直接返回head,不进行反转
  2. 新的head能够循环k次,将这一小段进行反转
  3. 传入本次操作的tail,作为下一次操作的head
  4. 返回pre

代码

import java.util.*;
public class Solution {
    public ListNode reverseKGroup (ListNode head, int k) {
        //找到每次翻转的尾部
        ListNode tail = head;
        //遍历k次到尾部 
        for(int i = 0; i < k; i++){ 
            //如果不足k到了链表尾,直接返回,不翻转
            if(tail == null) 
                return head;
            tail = tail.next; 
        }
        //翻转时需要的前序和当前节点
        ListNode pre = null; 
        ListNode cur = head;
        //在到达当前段尾节点前
        while(cur != tail){ 
            //翻转
            ListNode temp = cur.next; 
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        //当前尾指向下一段要翻转的链表
        head.next = reverseKGroup(tail, k); 
        return pre;
    }
}

思考草图

image-20231222212055793