Java将给出的链表中的节点每k个一组翻转,返回翻转后的链表

题目描述

将给出的链表中的节点每k个一组翻转,返回翻转后的链表

如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样

你不能更改节点中的值,只能更改节点本身。

只允许使用常数级的空间

例如:

给定的链表是1->2->3->4->5

对于 k = 2, 你应该返回 2->1->4->3->5

对于 k = 3, y你应该返回 3->2->1->4->5

public ListNode reverseKGroup (ListNode head, int k) {
        
        if(head == null || k == 1){
            return head;
        }
        
        int len = 0;
        ListNode curNode = head;
        while(curNode!=null){
            len++;
            curNode = curNode.next;
        }
        
        //自定义一个头指针节点
        ListNode node = new ListNode(-1);
        ListNode pre = node;
        pre.next = head;
        
        ListNode curNode2 = head;
        ListNode tempNode = null;
        
        for(int i=0;i<len/k;i++){
            
            //头插法 反转每一段节点 相当于单链表反转
            for(int j=1;j<k;j++){
                tempNode = curNode2.next;
                curNode2.next = tempNode.next;
                tempNode.next = pre.next;
                pre.next = tempNode;
            }
            
            //每段链表反转后 重新定位pre和curNode2 假设k=2 链表123
            //此时由于第一段链表已经反转 123变成了213 所以pre=1相当于头指针
            //curNode2 = 3
            pre = curNode2;
            curNode2 = curNode2.next;
        }
       
        return node.next;
    }