25. K 个一组翻转链表-链表-困难

问题描述

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

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

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

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明:

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

解答

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
//递归天下无敌
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(k==1 || head==null || head.next == null)return head;
        ListNode test = head;
        int i = k;
        while(--i!=0){
            test = test.next;
            if(test == null)return head;
        }
        i = k;
        
        ListNode p = head,q = p.next,r = q.next;
        while(--i!=0){
            q.next = head;
            p.next = r;

            head = q;
            q = r;
            if(r!=null)r = r.next;
        }
        p.next = reverseKGroup(q, k);
        return head;
    }
}
原文地址:https://www.cnblogs.com/xxxxxiaochuan/p/13354254.html