Leetcode题25、K个一组翻转链表(Python题解)字节跳动面试题

问题
在这里插入图片描述

题目来源:力扣(LeetCode)

leetcode25.K个一组翻转链表

难度:困难
分析
主要考察链表操作熟练度

解决方法
1:递归

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

#按照逻辑写就行,考熟练度和细节吧
#超过87%
class Solution:
    # 翻转一个子链表,并且返回新的头与尾
    def reverse(self, head: ListNode, tail: ListNode):
        pre = tail.next  # 定个锚点,这k个链结束的地方就是pre
        temp = head  # 现在的头要变成翻转后的尾巴,存一下
        while pre != tail:
            temp_next = temp.next   #别忘了写next,会死循环的
            temp.next = pre
            pre = temp
            temp = temp_next
        return tail, head  # 得到新的头尾节点

    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        pre = dummy
        while head:
            tail = pre  # 找k链的尾结点
            for i in range(k):
                tail = tail.next
                if not tail:
                    return dummy.next  # 不满k个,就直接是返回哑结点。
            # 把翻转后的链连接到总链上去
            temp_next = tail.next
            head, tail = self.reverse(head, tail)
            pre.next = head
            tail.next = temp_next
            pre = tail
            head = tail.next
        return dummy.next

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值