使用迭代与递归相结合实现“K 个一组翻转链表”

题目:25. K 个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

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

解题思路

见代码注释与反转链表之递归操作链表

代码

# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution(object):
    def reverse(self, head, b):
        '''迭代反转b节点之前的链表,操作区间即[head,b),b=None时,反转整个链表,并返回新链表的第一个节点'''
        pre = None
        cur = head
        while cur != b:
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
        return pre

    def reverseKGroup(self, head, k):
        """
        反转以head为第一个节点的链表 的前k个节点
        并返回新链表的第一个节点
        """
        b = head
        t = k
        while t > 0:
            if b == None: return head  # 如果节点总数不是 k 的整数倍,将最后剩余的节点保持原有顺序。
            b = b.next
            t -= 1

        last = self.reverse(head, b)
        head.next = self.reverseKGroup(b, k)
        return last


# def print_list(head):
#     res = []
#     while head != None:
#         res.append(head.val)
#         head = head.next
#     print(res)
#
#
# s = Solution()
# node1 = ListNode(1)
# node2 = ListNode(2)
# node3 = ListNode(3)
# node4 = ListNode(4)
# node5 = ListNode(5)
# node1.next = node2
# node2.next = node3
# node3.next = node4
# node4.next = node5
# node5.next = None
# print_list(node1)
# print_list(s.reverseKGroup(node1, 3))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值