21.03.12 LeetCode25. K 个一组翻转链表

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

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

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

进阶:

你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
 

示例 1:


输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:


输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
示例 3:

输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]
示例 4:

输入:head = [1], k = 1
输出:[1]

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(k==1)
            return head;
        ListNode dst = new ListNode(-1,head);
        ListNode pre = dst;
        ListNode end = dst;
        while(end.next!=null)
        {
            //让end指针走到pre后的第k个节点
            for(int i = 0;i<k && end!=null;i++)
                end = end.next;
            //如果end走到null证明pre后面的节点不足k个,不做任何操作,直接返回
            if(end==null)
                break;
            //如果不为null
            ListNode next = end.next;
            ListNode start = pre.next;//
            end.next = null;
            pre.next = reverse(start);//反转链表,然后接上pre
            start.next = next;//接上next
            //pre跳转到start位置。
            pre = start;
            end = pre;//重置end位置
        }
        return dst.next;
    }
    public ListNode reverse(ListNode node)
    {
        ListNode pre = null;
        ListNode next = null;
        ListNode cur = node;
        while(cur!=null)
        {
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}

 

posted @ 2021-03-12 11:32  γGama  阅读(28)  评论(0编辑  收藏  举报