编程题目:输入一个链表,输出该链表中倒数第k个节点
两种方法
1.在链表的初始化数据中加入 num 数据, 每添加一个节点,num加1,每删除一个节点,num减1
查找倒数第k个元素,即 指向第一个节点的指针向后移动 num - k 步。
2.使用两个指针 i 和 j, i和j初始化都指向第一个节点。
查看倒数第k个元素,先将 j 向右移动 k-1 步。
再将 i 和 j 同时向右移动,直到 j 指向最后一个元素结束。
这时候 i 指向的元素即 倒数第k个元素。返回 i 指向节点的值即可。
#!/usr/bin/env python3
# -*- coding: utf-8 -*- class Node(object):
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_ class Simple_List(object):
def __init__(self):
self.head = None
self.num = 0 def is_empty(self):
return self.head is None def prepend(self, elem):
self.head = Node(elem, self.head)
self.num += 1 def prepop(self):
if self.is_empty():
raise ValueError("List is Empty")
e = self.head.elem
self.head = self.head.next
self.num -= 1
return e def bianli(self):
p = self.head
li = []
while p:
li.append(p.elem)
p = p.next
return li def find_the_key(self, key):
n = self.num - key
p = self.head
while n:
p = p.next
n -= 1
return p.elem def find_the_key1(self,key):
i,j = self.head, self.head
while key-1:
j = j.next
key -= 1
while j.next:
i = i.next
j = j.next
return i.elem if __name__ == "__main__":
sl = Simple_List()
for i in [1,4,8,2,4,8,5]:
sl.prepend(i)
print("链表:",sl.bianli())
key = int(input("查看该链表倒数第k个值:"))
print("倒数第k个值:",sl.find_the_key(key))
print("倒数第k个值:",sl.find_the_key1(key))
之前写这个题目的时候没有注意到边界问题,当用户输入的key值不合理时,会发生错误。
所以我们要对用户输入的数据进行判断并处理。
修改的地方如下,其他地方不变
def find_the_key(self, key):
if key < 1 or key > self.num:
raise ValueError("num must in 0<key<={}".format(self.num))
n = self.num - key
p = self.head
while n:
p = p.next
n -= 1
return p.elem def find_the_key1(self,key):
if key < 1:
raise ValueError("num is unabled,please repeat input")
i,j = self.head, self.head
while key-1:
j = j.next
key -= 1
if j is None:
raise ValueError("num is unabled,please repeat input")
while j.next:
i = i.next
j = j.next
return i.elem
编程题目:输入一个链表,输出该链表中倒数第k个节点的更多相关文章
- 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)
题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ...
- 题目15 链表中倒数第K个节点
///////////////////////////////////////////////////////////////////////////////////// // 5. 题目15 链表中 ...
- 链表中倒数第k个节点(Java)
链表中倒数第k个节点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:two-pointers思想,因为是单链表,没法得prevous点,直接遍历得到链表长度再重新遍历效率很低. 采用双指 ...
- 《剑指offer》 链表中倒数第k个节点
本题来自<剑指offer> 链表中倒数第k个节点 题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历 ...
- 剑指offer(14)链表中倒数第K个节点
题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...
- php实现求链表中倒数第k个节点
php实现求链表中倒数第k个节点 一.总结 $head = $head->next; //1.将$head节点next域里面的记录的那个地址值($head节点的下一个节点的地址)给$head,$ ...
- LeetCode 面试题22. 链表中倒数第k个节点
题目链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 输入一个链表,输出该链表中倒数第 ...
- 【剑指Offer】面试题22. 链表中倒数第k个节点
题目 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5.6. ...
- 力扣题解-面试题22. 链表中倒数第K个节点
题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...
- 图解算法——链表中倒数第k个节点
题目来源: 剑指 Offer 22. 链表中倒数第k个节点 leetCode 题目描述: 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个 ...
随机推荐
- table 实现向下滑动首行冻结,向右滑动左列冻结
<html> <head> <meta charset="utf-8"> <title>测试</title> <M ...
- 【Android多线程】异步任务AsyncTask类
https://www.bilibili.com/video/av65170691?p=9 (本文为此视频观看笔记) 一.为什么需要此类 Handler繁琐 二.理解AsyncTask 2.1 参数( ...
- Python3.5学习之旅——day1
本节内容: 1.Python介绍 2.Hello World程序 3.变量\字符编码 4.用户输入 5.if-else语句 6.循环语句 一.Python介绍 Python是一种动态解释性的强类型定义 ...
- 解Bug之路-记一次调用外网服务概率性失败问题的排查
前言 和外部联调一直是令人困扰的问题,尤其是一些基础环境配置导致的问题.笔者在一次偶然情况下解决了一个调用外网服务概率性失败的问题.在此将排查过程发出来,希望读者遇到此问题的时候,能够知道如何入手. ...
- Java基础知识笔记第八章:常用的实体类
String类 String类位于lang包下 java会默认导入lang包下的类,所以可以直接使用,注意String是final类所以不能有子类 构造String对象: 常量对象:String常量也 ...
- nginx 缓存
浏览器缓存与nginx缓存 浏览器缓存 优点:使用有效缓存时,没有网络消耗,速度快:即使有网络消耗,但对失效缓存使用304响应做到网络消耗最小化 缺点:仅提升一个用户的体验 nginx 缓存 优点:提 ...
- py related issues
在python中安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) pip inst ...
- JVM,JRE,JDK
JVM (Java Virtual Machine) : Java虚拟机,运行所有Java程序的假象计算机,是Java程序的运行环境,跨平台性由JVM实现. JRE (Java Runtime Env ...
- Linux命令:top命令
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...
- ATT&CK实战系列——红队实战(一)
一.环境搭建 1.环境搭建测试 最近想要开始学习内网渗透,搜集了一些教程,准备先实验一个vulnstack靶机,熟悉一下内网渗透操作再学习基础知识. 靶场下载地址:http://vulnstack.q ...