【LeetCode】每日一题:K个一组反转链表

解题思路

其实更像一个模拟题,但是有两个地方的边界一直没有处理好导致卡了很久。

AC代码

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]:
        def rotate(prev, tail):
        	# 少了一个end最开始,tail这个节点在循环修改next时候会变,从而导致循环终止条件错误,应该用一个定量记下来
            end = tail.next
            last = tail.next
            curr = prev.next
            res = prev.next
            while curr != end:
                temp = curr.next
                curr.next = last
                last = curr
                curr = temp
            prev.next = tail
            return res

        dummyhead = ListNode(0)
        dummyhead.next = head

        tail = dummyhead
        indexhead = dummyhead
        count = 0
    
        while indexhead:
            for _ in range(k):
            # 这个地方最开始写的是tail,其实应该是判断后面有没有了,后面没有就不能继续计数了
                if tail.next:
                    tail = tail.next
                    count += 1
                else:
                    break
            if count == k:
                tail = indexhead = rotate(indexhead, tail)
                count = 0
            else:
                break


        

        return dummyhead.next

官方题解

官方题解单独考虑了一个反转链表,然后把头尾返回,相当于把这个链表插回去

python 复制代码
class Solution:
    # 翻转一个子链表,并且返回新的头与尾
    def reverse(self, head: ListNode, tail: ListNode):
        prev = tail.next
        p = head
        while prev != tail:
            nex = p.next
            p.next = prev
            prev = p
            p = nex
        return tail, head

    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        hair = ListNode(0)
        hair.next = head
        pre = hair

        while head:
            tail = pre
            # 查看剩余部分长度是否大于等于 k
            for i in range(k):
                tail = tail.next
                if not tail:
                    return hair.next
            nex = tail.next
            head, tail = self.reverse(head, tail)
            # 把子链表重新接回原链表
            pre.next = head
            tail.next = nex
            pre = tail
            head = tail.next
        
        return hair.next

作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/248591/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关推荐
菜鸟学Python几秒前
Python 数据分析核心库大全!
开发语言·python·数据挖掘·数据分析
C++忠实粉丝1 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
小白不太白9502 分钟前
设计模式之 责任链模式
python·设计模式·责任链模式
喜欢猪猪7 分钟前
Django:从入门到精通
后端·python·django
糖豆豆今天也要努力鸭13 分钟前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
祁思妙想20 分钟前
10.《滑动窗口篇》---②长度最小的子数组(中等)
leetcode·哈希算法
何大春29 分钟前
【弱监督语义分割】Self-supervised Image-specific Prototype Exploration for WSSS 论文阅读
论文阅读·人工智能·python·深度学习·论文笔记·原型模式
福大大架构师每日一题31 分钟前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言
在下不上天38 分钟前
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
大数据·开发语言·python
SEVEN-YEARS41 分钟前
深入理解TensorFlow中的形状处理函数
人工智能·python·tensorflow