编程题目:输入一个链表,输出该链表中倒数第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个 ...
随机推荐
- office 格式定义
在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串转换成 科学计数法.现在网上找到解决方案之一: (在数字串 ...
- ZkApi的方法跨域访问ZkResource的静态资源文件出现的问题
问题:ZkApi的方法跨域访问ZkResource的静态资源文件出现下面的情况 解决方法: cd /usr/local/apache/conf/vhost vim .conf 将上面的文件php_ad ...
- 【转】Node.js到底是用来做什么的
Node.js的到底是用来做什么的 在阐述之前我想放一个链接,这是国外的一个大神,对于node.js非常好的一篇介绍的文章,英文比较好的朋友可以直接去阅读,本文也很大程度上参考了这篇文章,也同时感谢知 ...
- selenium webdriver 等待元素
/**显示等待并返回元素 * @param driver * @param locator */ public static WebElement showWait(WebDriver driver, ...
- 在IDEA中为SpringBoot配置热部署
版本:IDEA Community 2019.2.2,Spring Boot 2.1.8.RELEASE 流程:pom文件中添加依赖: <dependency> <groupId& ...
- python3升级pip报错ImportError: cannot import name 'main'
把系统的python版本从默认的2切换到3后,使用pip3安装依赖报错,如下: Traceback (most recent call last): File , in <module> ...
- Caffe2 的基本数据结构(Basics of Caffe2 - Workspaces, Operators, and Nets)[4]
这篇文章主要介绍Caffe2的基本数据结构: Workspaces Operators Nets 在开始之前最好先阅读以下Intro Turorial 首先,导入caffe2.其中core和works ...
- 动态设置WX滚动条的高度(非常重要)
wxml: <scroll-view class="scroll" scroll-y="true" style="height:{{client ...
- Day1-C-CF-1144A
简述:给你一串字符,判断是否由连续字母构成且每个字符只出现一次 思路:用set直接储存,判断size和初末位置字母与size的关系即可 代码: #include<iostream> #in ...
- redis的并发set
1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争. 这里的并发 ...