14.链表中倒数第K个结点-剑指offer-Python2.7

剑指offer第14题 牛客网在线编程链接 https://www.nowcoder.com/activity/oj
链表中倒数第K个结点

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

思路1
要想找到倒数第k个结点,我们可以先求出链表的总长度,然后就可以找到倒数第k个结点在链表中的位置,之后再遍历一遍链表,直到遍历到要求结点的位置时终止遍历。注意:输入的链表可能为空;k可能大于链表的长度;k可能为0,这些情况我们都返回空。

Python2.7编写

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        #如果链表为空或者要得到的是倒数第0个结点,则返回空
        if not head or k == 0:
            return
        p = head #用于求链表长度
        q = head #用于找到倒数第k个结点
        cnt = 0 #记录数组长度
        while p:
            cnt += 1
            p = p.next
        #如果要得到的节点编号大于链表总长度,则返回空
        if k > cnt: 
            return
        #倒数第k个结点的在链表中的位置
        target = cnt - k + 1 
        cnt_n = 0 #用于记录走过链表的长度
        #当走到要求结点的前一个节点时,停止。此时q指向的结点即为要求的结点。
        while target - 1 != cnt_n:
            q = q.next
            cnt_n += 1
        return q

思路2
第一种思路需要遍历链表2次,耗时较多。第二种思路可以只遍历一遍链表找出倒数第k个结点。
设置两个指针p,q分别指向头结点,第一个指针p向前走k-1步,此时指针p指向正数第k个结点,在这个过程中保持第二个指针不动。接下来让指针p和q同时移动,每次移一步,这样当指针p指向尾结点的时候,指针q指向倒数第k个结点。同样需要注意:输入的链表可能为空;k可能大于链表的长度;k可能为0,这些情况我们都返回空。

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        #确保鲁棒性:链表为空以及k为0时的情况
        if not head or k == 0:
            return None
        
        p = head
        q = head
        #当for循环终止的时候,指针p指向正数第k个结点
        #此时如果k的值大于链表的长度,则p.next为None,则直接返回None
        for i in range(k - 1):
            if p.next != None:
                p = p.next
            else:
                return None
        #指针p和指针q同时移动,当指针p到达尾结点的时候,指针q指向倒数第k个结点
        while p.next != None:
            p = p.next
            q = q.next
        return q

写在后面
第二种思路参考:https://blog.csdn.net/sqiu_11/article/details/77657840

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值