每日打卡:K 个一组翻转链表

118 阅读1分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

原题链接

虽然这是一道困难题,但是并没有那么难,我们昨天说的就是反转链表,今天K个一组的反转,我们只需要将我们的链表分成一段一段的来反转不就可以了吗?

2271F7C2C95E93496D1284607E16E93F.jpg

思路我们有了,现在开始实现

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
    //我们对链表是否为空或者单个做出判定,根据K的要求,如果K为1,我们不需要反转,我们都是直接返回我们的链表
        if(head==null || head.next==null || k==1){
            return head;
        }
        //定义新的节点,我们通过for循环的方式,将节点连接起来
        ListNode nowlist = head;
        for(int i=0; i<k;i++){
            //如果,剩下的长度小于K,我们返回我们剩下的节点
            if(nowlist==null){
                return head;
            }
            //连接节点
            nowlist=nowlist.next;
        }
        //调用我们自定义函数,来反转我们某一段的链表
        ListNode newlist = reversal(head,nowlist);
        //通过递归调用开始下一段的反转,函数完成将每一段节点连接起来
        head.next=reverseKGroup(nowlist,k);
        return newlist;
    }
    //head是需要反转的链表的起始部位,我们通过对比nowlist节点,来判断我们反转终止的位置
    public ListNode reversal(ListNode head,ListNode nowlist){
        ListNode right = null;
        ListNode left = head;
        while (left != nowlist) {
            ListNode next = left.next;
            left.next = right;
            right = left;
            left = next;
        }
        return right;
    }
}