首页 > 编程语言 >【剑指offer】JZ22-链表中倒数第k个节点-Python解法

【剑指offer】JZ22-链表中倒数第k个节点-Python解法

时间:2024-07-01 17:30:59浏览次数:3  
标签:遍历 ListNode offer Python self 链表 pHead 指针

1.题目描述

2.解题思路(Python版)

方法一:遍历两次

思路:

1.首先计算链表的长度L;

2.第二次开始从头依次遍历,找到链表的第(L-k+1)个节点,即为所找的节点。

参考代码:

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param pHead ListNode类 
# @param k int整型 
# @return ListNode类
#
class Solution:
    def FindKthToTail(self , pHead: ListNode, k: int) -> ListNode:
        # write code here
        Length = self.GetListLength(pHead)   #计算链表长度
        if Length < k:    #如果所查找的点超过链表长度,返回一个空链表
            return None
        KthNode = pHead
        for i in range(Length - k):     #循环(L-k)次后,指向第(L-k+1)个节点
            KthNode = KthNode.next
        return KthNode
    #定义计算链表长度的函数
    def GetListLength(self , pHead:ListNode):   
        ListLength = 0
        pNode = pHead
        while pNode:
            ListLength = ListLength + 1
            pNode = pNode.next
        return ListLength

复杂度:

时间复杂度O(N):N为链表的长度,对链表做了两次遍历,第一次遍历长度为N,第二次遍历长度为(N-k+1)。

空间复杂度O(1):在遍历过程中没有借助额外的辅助空间。

方法二:双指针法(只用遍历一次)

思路:

1.定义两个指针,第一个指针从链表的头指针开始遍历,向前走(k-1)步,第二个指针保持不动;

2.从第k步开始,第二个指针也开始从链表的头指针开始遍历;

3.由于两个指针之间的距离始终为(k-1)步,因此当第一个指针到达链表尾节点时,第二个指针刚好指向第k个节点。

4.需要考虑的特殊情况:(1)原始链表为空;(2)k=0;(3)k大于链表的长度。在代码中需要增加对以上三种特殊情况的处理。

参考代码:

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param pHead ListNode类 
# @param k int整型 
# @return ListNode类
#
class Solution:
    def FindKthToTail(self , pHead: ListNode, k: int) -> ListNode:
        # write code here
        if pHead is None or k == 0:     #如果链表为空或者k=0
            return None
        AheadNode = pHead     #先出发的指针
        BehindNode = pHead   #后出发的指针
        for i in range(k - 1):    #快指针先走(k-1)步
            if AheadNode.next:        #还没到第k个节点,链表就已经遍历完了
                AheadNode = AheadNode.next
            else:
                return None
        while AheadNode.next:     #一直遍历到原始链表的尾节点
            AheadNode = AheadNode.next
            BehindNode = BehindNode.next
        return BehindNode

复杂度:

时间复杂度O(N):N为链表的长度,两个指针只对链表做了一次遍历。

空间复杂度O(1):在遍历过程中没有借助额外的辅助空间。

3.重要知识点

(1)在动手写代码之前先分析当前思路的复杂度,并与面试官沟通对方期望的解法限制条件;

(2)注重代码的鲁棒性,尤其是对于特殊输入实例,自己要在代码中预设对特殊情况的解决方案。

标签:遍历,ListNode,offer,Python,self,链表,pHead,指针
From: https://blog.csdn.net/weixin_50335953/article/details/140082639

相关文章

  • 【每日一练】python入门级小学生自写小程序
    """写一个公司发工资小程序条件分析:公司人数10人共有工资金2万元共有奖金1000元管理工资3000元/每人员工基本工资2000元/每人三年以上员工奖金200元/每人"""#先定义出公司人数总金额奖金gsrs=10jine=20000jiangjin=1000#获取职位层级人员print("""......
  • python爬虫之基于终端指令的持久化存储
    python爬虫之基于终端指令的持久化存储scrapy持久化存储基于终端指令:1、要求:只可以将parse方法的返回值存储到本地的文本文件中2、注意:持久化存储对应的文本文件类型只可以为:‘json’,‘jsonlines’,‘jsonl’,‘jl’,‘csv’,‘xml’,‘marshal’,‘pickle’3......
  • Python: 送你一朵小红花
    importtimeimportnumpyasnpimportmatplotlib.pyplotasplt#绘制玫瑰花并添加文字importturtle#设置画布大小#turtle.screensize(canvwidth=None,canvheight=None,bg=None)turtle.setup(width=0.6,height=0.6)#设置初始位置turtle.penup()turtle.......
  • Azure Function App With Python 3.11
    有一段python代码,原来都跑在本地,既然functionapp可以运行python,还是比较新的python3.11,就想着直接用functionapp来跑了,省的进行sql逻辑改造,并且不吹不黑,python的pandas在处理dataframe上非常灵活。想法是好的,本地VSCODE搭起来python运行环境也很快,直接AZsignin就部署到自己......
  • 边玩边学,10个Python小游戏(含源码)
    经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对?比方说,你有没有想过,可以通过打游戏来学编程?今天我想跟大家分享10个Python小游戏,教你如何通过边打游戏边学编程!接下来就一起来看看吧~1、飞机大战源码分享:importr......
  • 用python代码实现超级玛丽游戏(详细动画展示+源码分享)
    效果展示:温馨提示:篇幅有限,完整代码已打包文件夹,获取方式在:1.画面和角色的导入创建屏幕、从图片中导入Mario#屏幕创建和初始化参数self.screen=pygame.display.set_mode((WIDTH,HEIGHT))self.rect=self.screen.get_rect()pygame.display.set_caption(TITLE)......
  • 这5个炫酷的python 数据可视化工具,你用过吗?
    常用的Python数据可视化小工具,推荐下面几个,熟练使用以后,做数据可视化不再是难题,并且,这几个数据可视化库在使用时可以取长补短,将数据信息表达发挥到极致,下面一起了解,都有哪些数据可视化库?可以帮助我们更好地呈现数据。1、Matplotlib:基础绘图库官网:https://www.matplotlib......
  • pyenv: python虚拟环境工具
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录0x0安装配置pyenv和virturalenv插件0x00pyenv0x01pyenv-virtualenv插件0x02pyenv下载安装包速度0x1使用pyenv0x2卸载pyenv0x3pyenv配置问题0x30问题描述0x31debug0x32problem0x33复现......
  • 《从零开始学Python》(第二版) PDF读书分享
    Python是一种面向对象、解释型计算机程序设计语言,由GuidovanRossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。Python在设计上坚......
  • python sklearn机械学习模型-分类
    ......