【重点】【递归】25.K个一组翻转链表

博客聚焦于K个一组翻转链表问题,提到灵茶山艾府有迭代写法但细节多,主要采用递归解法。还给出了Python和Java两种语言的实现方向,Java参考《算法小抄》。

题目

Python

灵茶山艾府中提供了迭代写法,但细节太多,此题以递归解法为主!!!

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        start = end = head
        for _ in range(k):
            if not end:
                return start
            end = end.next
        newHead = self.reverseList(start, end)
        start.next = self.reverseKGroup(end, k)

        return newHead

    # 翻转[a, b)之间的链表
    def reverseList(self, start, end):
        pre = None
        cur = start
        while cur != end:
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt

        return pre

Java

参考《算法小抄》

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null) {
            return null;
        }
        ListNode start = head, end = head;
        for (int i = 0; i < k; ++i) {
            if (end == null) {
                return head;
            }
            end = end.next;
        }
        ListNode newHead = reversePart(start, end);
        start.next = reverseKGroup(end, k);
        return newHead;
    }

    // 翻转区间[a, b)之间的链表,并返回反转后的头结点。注意:这里翻转后断开了
    public ListNode reversePart(ListNode a, ListNode b) {
        ListNode pre = null, cur = a;
        while (cur != b) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }

        return pre;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值