牛客网刷题笔记四 链表节点k个一组翻转

NC50 链表中的节点每k个一组翻转

题目:

思路:

这种题目比较习惯现在草稿本涂涂画画链表处理过程。整体思路是赋值新的链表,用游离指针遍历原始链表进行翻转操作,当游离个数等于k时,就将翻转后的链表接到新的链表后,如最后个数不满k,则将原始链表剩余节点接到新的链表后。

游离的过程中,每次将当前游离的头节点赋为最新遍历的节点,同时将前一个节点链接到下一个节点。

这个代码写的过程中有点绕,过程有些bug,写了个打印链表的函数调试了下。

代码

python3 复制代码
class Solution:
    def reverseKGroup(self , head: ListNode, k: int) -> ListNode:
        def printList(h):
            ## 打印链表
            result = []
            t = h
            while t:
                result.append(t.val)
                t = t.next
            print(result)
        # write code here
        if not head or not head.next or k == 1:
            return head
        newHead = ListNode(head.val) ## 最终输出的头节点
        newTail = ListNode(head.val) ## 每次翻转完成确定尾节点
        
        curHead = ListNode(head.val) ## 当前游离的头节点
        curNode = curHead ## 当前游离节点
        curTail = curHead

        oriNextNode = head.next ## 原始节点顺序
        oriCurHead = head ## 记录原始链表中每次遍历的组里的头节点
        count = 1
        switchTime = 0 ## 成功翻转的组数
        while curNode:
            # print(f'{switchTime}次交换的{count}位')
            if count < k and oriNextNode:
                ## 可以继续遍历的情况
                curNode = ListNode(oriNextNode.val) ## 游离原始链表的节点
                curNode.next = curHead ## 将最新的节点指向当前游离组里的头节点,实现翻转
                curHead = curNode ## 最新节点为头节点
                oriNextNode = oriNextNode.next if oriNextNode else None ## 继续遍历原始链表
                count+=1
            elif count == k:
                ## 成功翻转的情况
                count = 1
                switchTime += 1
                if switchTime == 1:
                    newHead = curHead ## 第一次翻转,获取翻转后的头节点
                    newTail = curTail
                else:
                    newTail.next = curHead ## 除了第一次翻转,其余均用翻转后的尾节点做关联指向下一组节点
                    newTail = curTail
                curHead = ListNode(oriNextNode.val) if oriNextNode else None ## 获取下一组的头节点
                curNode = curHead
                curTail = curHead
                oriCurHead = oriNextNode ## 获取下一组的原始头节点
                oriNextNode = oriNextNode.next if oriNextNode else None
            elif switchTime >= 1:
                ## 无法继续遍历,且有翻转过的情况
                newTail.next = oriCurHead
                return newHead
            else:
                ## 一次翻转都未成功的情况
                return head
            # printList(newHead)
            # printList(curHead)
            # printList(head) 
        return newHead
相关推荐
摇滚侠9 分钟前
Spring Boot3零基础教程,Spring Boot 应用打包成 exe 可执行文件,笔记91 笔记92 笔记93
linux·spring boot·笔记
开开心心就好15 分钟前
电子报纸离线保存:一键下载多报PDF工具
网络·笔记·macos·pdf·word·音视频·phpstorm
朝新_19 分钟前
【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战
前端·笔记·spring·ajax·交互·javaee
墨染点香1 小时前
LeetCode 刷题【138. 随机链表的复制】
算法·leetcode·链表
是Yu欸2 小时前
【博资考5】网安2025
网络·人工智能·经验分享·笔记·网络安全·ai·博资考
报错小能手2 小时前
C++笔记(面向对象)RTTI操作符
开发语言·c++·笔记
CodeLongBear2 小时前
计算机网络学习笔记 | 传输层核心知识点总结(DAY03,匠心制作)
笔记·学习·计算机网络
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [kernel][time]tick
linux·笔记·学习
峰顶听歌的鲸鱼4 小时前
9.OpenStack管理(三)
运维·笔记·分布式·openstack·学习方法
立志成为大牛的小牛5 小时前
数据结构——三十七、关键路径(王道408)
数据结构·笔记·程序人生·考研·算法