题目描述

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

题目地址

https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

三个特例:如果输入的链表为空;k大于链表的长度;k为0的情况。对于正常情况,设置两个指针分别指向头结点,第一个指针向前走k-1步,走到正数第k个结点,同时保持第二个指针不动,然后第一个指针和第二个指针每次同时前移一步,这样第一个指针指向尾结点的时候,第二个指针指向倒数第k个结点。判断尾结点的条件是 p.next == None。

Python

  1. # -*- coding:utf-8 -*-
  2. class ListNode:
  3. def __init__(self, x):
  4. self.val = x
  5. self.next = None
  6.  
  7. # 单向链表链表 node1: 1->2->3
  8. node1 = ListNode(1)
  9. node2 = ListNode(2)
  10. node3 = ListNode(3)
  11. node4 = ListNode(4)
  12. node1.next = node2
  13. node2.next = node3
  14. node3.next = node4
  15.  
  16. class Solution:
  17. def FindKthToTail(self, head, k):
  18. if not head or k <= 0:
  19. # 链表为空或k小于等于0
  20. return None
  21. p = head
  22. q = head
  23. for i in range(1,k):
  24. if p.next == None:
  25. # k大于链表的长度
  26. return None
  27. else:
  28. p = p.next
  29. while p.next:
  30. p = p.next
  31. q = q.next
  32. return q
  33.  
  34. if __name__ == '__main__':
  35. originList = node1
  36. print('链表:',end = ' ')
  37. while originList:
  38. print(originList.val, end = ' ')
  39. originList = originList.next
  40. k = 5
  41. result = Solution().FindKthToTail(node1,k)
  42. print('\n倒数第{0}个结点:'.format(k),end = ' ')
  43. while result:
  44. print(result.val,end = ' ')
  45. result = result.next


推广: 寻找中间节点, 两个指针一起, 第一个指针每次走两步, 第二个指针每次走一步, 快指针指到尾部, 慢指针正好指到中间

  1. def FindMidNode(self,head):
  2. """
  3. 推广: 寻找中间节点, 两个指针一起,
  4. 第一个指针每次走两步, 第二个指针每次走一步,
  5. 快指针指到尾部, 慢指针正好指到中间
  6. """
  7. if not head:
  8. return None
  9. p = head
  10. q = head
  11. p = p.next
  12. while p:
  13. p = p.next
  14. if p:
  15. p = p.next
  16. q = q.next
  17. return q
  18.  
  19. mid = Solution().FindMidNode(node1)
  20. print('\n中间结点:',end = ' ')
  21. while mid:
  22. print(mid.val, end = ' ')
  23. mid = mid.next

剑指Offer 14. 链表中倒数第k个结点 (链表)的更多相关文章

  1. [剑指Offer]22-链表中倒数第k个结点

    题目链接 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&t ...

  2. 剑指offer 14. 链表中倒数第 k 个结点

    14. 链表中倒数第 k 个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点 法一:快慢指针 快指针先走 k 步,等快指针到达尾部时,慢指针所指结点即是倒数第 k 个结点 public cla ...

  3. 《剑指offer》— JavaScript(14)链表中倒数第k个结点

    链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点: 然后两个指针同时 ...

  4. 【剑指Offer】14、链表中倒数第k个结点

      题目描述:   输入一个链表,输出该链表中倒数第k个结点.为了符合习惯,从1开始计数,即链表的尾结点是倒数第1个节点.例如,一个链表有6个结点,从头结点开始,它们的值依次是1,2,3,4,5,6. ...

  5. 【Java】 剑指offer(22) 链表中倒数第k个结点

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...

  6. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  7. 剑指Offer - 九度1517 - 链表中倒数第k个结点

    剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...

  8. 剑指Offer:链表中倒数第k个结点【22】

    剑指Offer:链表中倒数第k个结点[22] 题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思考 我们定义两个指针L和R,R事先移动K-1个位置,然后两者同时往后移动直到遇到R的下个节点为 ...

  9. 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点

    鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...

随机推荐

  1. 《CSS世界》读书笔记(六)

    <!-- <CSS世界> 张鑫旭著 --> min-width/max-width和min-height/max-height min-width/max-width出现的场景 ...

  2. jquery简易tab切换

    切换tab 使用eq()函数 eq() 方法将匹配元素集缩减值指定 index 上的一个. //为项目 3 设置红色背景 <ul> <li>list item 1</li ...

  3. nginx 番外----添加第三方模块

    #第三方模块需要先进行下载,然后再编译时指定文件目录 1.查看当前编译模块 root@nginx sbin]# ./nginx -V #查看当前添加模块 nginx version: nginx/ b ...

  4. Docker 部署 portainer

    Docker 部署 portainer 环境: docker 版本 :18.09.1 主机地址:192.168.1.81 一.部署 porttainer 1.修改docker配置文件,开放端口. vi ...

  5. Angular7 表单

    Angular 表单 input.checkbox.radio. select. textarea 实现在线预约功能 html 文件 <h2>人员登记系统</h2> <d ...

  6. 安卓内嵌H5只展示部分静态页面

    问题: 安卓内嵌H5在华为P9部分机型只展示h5静态页面无法展示接口返回渲染的页面 解决办法: Android  关闭硬件加速   android:hardwareAccelerated=" ...

  7. freeswitch 显示主叫名称和主叫号码

    1.指定主叫号码 origination_caller_id_number 参数来指定显示的主叫号码 2.指定主叫名称 origination_caller_id_name 参数来指定显示的主叫名称 ...

  8. pip使用豆瓣的镜像源

    豆瓣镜像地址:https://pypi.douban.com/simple/ 虽然用easy_install和pip来安装第三方库很方便 它们的原理其实就是从Python的官方源pypi.python ...

  9. css实现横向进度条和竖向进度条

    一.横向进度条 <html> <head> <title>横向进度条</title> <style type="text/css&quo ...

  10. 同事在使用shiro后遇到的异常

    一切配置按照demo来的,给他讲了一遍捋顺了.然后之前他做的demohim按照他网络摘抄的shiro博客看的. 然后注册了,正常,登录,提示密码不匹配. 问题出在注册的密码加密次数是2, 而shiro ...