LeetCode_双指针_递归_困难_25.K 个一组翻转链表

x33g5p2x  于2022-02-07 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(260)

1.题目

给你一个链表,每 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]

提示:
列表中节点的数量在范围 sz 内
1 <= sz <= 5000
0 <= Node.val <= 1000
1 <= k <= sz

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

2.思路

(1)双指针+递归
参考递归思维:k 个一组反转链表

3.代码实现(Java)

//思路1————双指针
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null) {
            return null;
        }
        ListNode node1, node2;
        node1 = node2 = head;
        for (int i = 0; i < k; i++) {
            //待反转的节点总数不足k个,无需反转,保留原有顺序即可
            if (node2 == null) {
                return head;
            }
            node2 = node2.next;
        }
        //反转前k个元素
        ListNode newHead = reverse(node1, node2);
        //递归反转后续链表并连接起来
        node1.next = reverseKGroup(node2, k);
        return newHead;
    }
    
    //反转链表区间[node1,node2)
    public ListNode reverse(ListNode node1, ListNode node2) {
        ListNode pre, cur, nxt;
        pre = null;
        cur = node1;
        nxt = node1;
        while (cur != node2) {
            nxt = cur.next;
            //逐个反转节点
            cur.next = pre;
            //更新指针位置
            pre = cur;
            cur = nxt;
        }
        //返回反转后的头节点
        return pre;
    }
}

相关文章