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

题目

将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 O(1)
例如:
给定的链表是1→2→3→4→5
对于 k=2, 你应该返回 2→1→4→3→5
对于 k=3, 你应该返回 3→2→1→4→5

题目分析

这里我借用一个大神化的过程图,写的真好看
image

思路:先计算链表长度根据k计算需要翻转几轮,每一轮就采取头插法实现翻转

代码(有注释):

 public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        if(head==null||head.next==null||k<2){
            return head;
        }
        //构造一个新的头节点,方便返回值时找到反转后链表的头节点。
        ListNode res = new ListNode(0);
        res.next = head;
        
        //定义三个指针
        ListNode pre = res,cur=head,tmp=null;
        
        //链表长度
        int length = 0;
        while(head!=null){
            length++;
            head = head.next;
        }
        
        //循环几次,每次k个,这里也是采用头插法的方式
         //pre作为每一小段链表的头节点,负责衔接
        for(int i = 0;i<length/k;i++){
            for(int j=1;j<k;j++){
                tmp = cur.next;
                cur.next = tmp.next;
                tmp.next = pre.next;
                pre.next = tmp;
            }
            //每个子序列反序完成后,pre,cur需要更新至下一子序列的头部
            pre = cur;
            cur = cur.next;
        }
        return res.next;
    }
posted @ 2021-04-16 15:31  Diamond-fz  阅读(432)  评论(0编辑  收藏  举报