剑指Offer刷题笔记——链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。

注意这题要求返回的是结点,不是结点的数值。

首先比较好想的思路就是,把列表遍历一遍,按要求在存储的列表里拿出来要求的结点

 

    def FindKthToTail(self, head, k):
        # write code here
        if head  == None or k==0:
            return None
        result  = []
        while head != None:
            result.insert(0,head)
            head = head.next
        if k > len(result):
            return None
        return result[k-1]

还有一个思路就是双指针。

class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        if head  == None or k<=0:
            return None
        fast = head
        slow = head

# 让快指针先走
        while k>1:
            if fast.next !=  None:
                fast = fast.next
                k-=1
            else:
                return None

# 快慢指针一起走 
        while fast.next != None:   # fast的下一个结点是空,说明该指针已经到达最末尾。
            fast = fast.next
            slow = slow.next
        return slow

这个题主要的问题是不知道,链表的结尾在哪。如果直接用一个指针找到结尾之后, 由于是单向链表没办法回到溯第k个结点。

所以需要两个指针,快指针是为找到结尾,慢指针和快指针保持k-1的距离,快指针到达结尾时候,慢指针指向就是所要的结点。

快慢指针组成了一把尺子,想象尺子是怎么量东西的?把尺子和被测物体一端对齐,尺子另一端就是要的地方。

为什么尺子的长度是k- 1?这是因为快指针遍历到结尾的时候,它本身就是占有一个位置。举个极端的例子,如果k=1,就是取结尾的结点,快慢指针应该是没有距离的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值