python经典算法面试题1.5:如何找出单链表中的倒数第K个元素
本题目摘自《Python程序员面试算法宝典》,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中。
【微软笔试题】
难度系数:⭐⭐⭐
考察频率:⭐⭐⭐⭐⭐
题目描述:
找出单链表中的倒数第k个元素,例如给定单链表:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7,则单链表的倒数第3个元素为5.
方法一:顺序遍历法
这种方法需要对单链表进行两次遍历,第一次遍历得到单链表的长度,这样我们在第二次遍历过程中就知道了什么时候找到了我们需要的那个元素了。
方法二:快慢指针法
由于单链表只能从头到尾巴依次访问链表的各个结点,因此如果我们要找链表的倒数第k个元素,也只能从头到尾巴遍历查找,设置两个指针,让其中一个指针比令一个指针先走k步(如果第k个元素存在的话),然后两个指针同时向后走,直到快指针走到最后一个元素,这时候慢指针所指向的位置就是要找的元素了。
两个方法的代码如下:
class Node: # 结点类
def __init__(self, data):
self.data = data
self.next = None
class SingleLinkList: # 单链表类
def __init__(self):
self.head = None
self.tail = None
def append(self, x): # 单链表尾部追加方法
if self.head is None:
self.head = self.tail = Node(x)
else:
self.tail.next = Node(x)
self.tail = self.tail.next
# 创建链表
test_link = SingleLinkList()
for i in range(1, 8):
test_link.append(i)
# 打印链表看一下
p = test_link.head
print("链表:", end="\t")
while p is not None:
print(p.data, end="\t")
p = p.next
print()
# 方法一 顺序遍历法
def find_it(link: SingleLinkList, k):
# 第一步获取长度
i = 0
p = link.head
while p is not None: # 循环完成后 i就是链表的长度
i += 1
p = p.next
if i < k:
return None
j = 0
p = link.head
while i - j > k: # 循环完成后 p就是倒数第三个结点
p = p.next
j += 1
return p.data
# 测试方法一
t = test_link
k = 5
print(f"倒数第{k}个元素是:", find_it(t, k), "(顺序遍历法)")
# 方法二 快慢指针法
def find_it(link: SingleLinkList, k):
slow = link.head # slow指向第一个元素
j = 1
p = link.head
while p is not None: # 如果链表的元素个数少于k, return None
p = p.next
j += 1
if j >= k:
break
else:
return None
fast = p # fast指向第k个元素
while fast.next is not None: # 循环结束之后fast指向最后一个元素,slow指向倒数第k个元素
slow = slow.next
fast = fast.next
return slow.data
# 测试方法二
t = test_link
k = 5
print(f"倒数第{k}个元素是:", find_it(t, k), "(快慢指针法)")
两个方法的时间复杂度都是O(n),不同在于方法一最坏可能要遍历两遍,方法二只需要遍历一遍。
python经典算法面试题1.5:如何找出单链表中的倒数第K个元素的更多相关文章
- 【BAT经典算法面试题系列】求和为n的连续正整数
马上就要到9月份了,意味着一年一度的秋招就要开始了,相信不论是正在实习的童鞋还是马上就要找工作的童鞋,BAT无疑是国内的"明星企业",是每个学计算机的小伙伴们心之向往的企业,但是呢 ...
- 前端常见算法面试题之 - 从尾到头打印链表[JavaScript解法]
题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值 实现思路 前端工程师看到这个题目,直接想到的就是,写个while循环来遍历链表,在循环中把节点的值存储在数组中,最后在把数组倒序后,遍 ...
- java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载
从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 1,张三,28 2,李四,35 3,张三,28 4,王五,35 5,张三,28 6,李四,35 7,赵六,28 ...
- 《剑指offer》面试题15 链表中的倒数第k个节点 Java版
书中方法:用两个节点一次遍历求得倒数第k个节点.注意头节点为空,k<=0,k大于节点个数的情况. public ListNode find(ListNode head, int k){ if(h ...
- 华为Python 算法面试题
华为算法面试题 """ 算法题: 提供一个序列,完成对这个序列的分割.要求分割后的两个序列彼此差值最小 实现函数,返回两个序列 """ de ...
- Twitter算法面试题详解(Java实现)
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...
- 【转】Twitter算法面试题详解(Java实现)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://androidguy.blog.51cto.com/974126/1319659 ...
- 算法面试题:一个List<Student>,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!
算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点! 解题思路 这是群里某位小伙伴去面试碰到的面试题,从题目本身来看,面试官应该是要考察面试者对泛型 Lis ...
- LeetCode 算法面试题汇总
LeetCode 算法面试题汇总 算法面试题 https://leetcode-cn.com/problemset/algorithms/ https://leetcode-cn.com/proble ...
随机推荐
- 面试常考各类排序算法总结.(c#)
前言 面试以及考试过程中必会出现一道排序算法面试题,为了加深对排序算法的理解,在此我对各种排序算法做个总结归纳. 1.冒泡排序算法(BubbleSort) 1.1 算法描述 (1)比较相邻的元素.如果 ...
- 数据存储检索之B+树和LSM-Tree
作为一名应用系统开发人员,为什么要关注数据内部的存储和检索呢?首先,你不太可能从头开始实现一套自己的存储引擎,往往需要从众多现有的存储引擎中选择一个适合自己应用的存储引擎.因此,为了针对你特定的工作负 ...
- postman动态数据获取
1.以获取token(JWT)和uid为例 2.在登录接口的tests中写入代码(因为登录接口报文信息中有返回JWT和uid) 3.在其他接口中需要用到JWT和uid的地方设置变量{{JWT}}和{{ ...
- luogu P4035 [JSOI2008]球形空间产生器
[返回模拟退火略解] 题目描述 今有 n+1n+1n+1 个 nnn 维的点,它们都在一个球上.求它们所在球的球心. Solution 4035\text{Solution 4035}Solution ...
- JQ获取元素属性值
最近在学习JAVA Web,自己也是做个下列表左右选择的小案例. 获取某个元素的属性值一直以为是要调用atrr方法,不过好像获取元素的数组形式再遍历每个元素的时候想获取到它的属性值用attr方法有问题 ...
- VS2017-Linux项目-使用第三方库如何配置
1.虚拟机Ubuntu 16.04,安装第三方库,perftools::tcmalloc. 2.Win10下vs2017创建linux项目. 3.项目>>属性>>VC++ 目录 ...
- Redis学习四(运维指南).
一.上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性. redis 的运行机器 CPU 不求核数多,但求主频高 ...
- 使用 statcounter 统计 Hexo 博客访问量
介绍 statcounter是一个提供网站访问统计服务的网站: StatCounter is a simple but powerful real-time web analytics service ...
- office visio 2019 下载激活
安装 下载 office ed2k://|file|cn_office_professional_plus_2019_x86_x64_dvd_5e5be643.iso|3775004672|1E4FF ...
- H5 video踩坑实录
前段时间公司APP做了一个APP论坛会议,嵌入了h5播放器.我以为很简单,没想到,这正是我踩进泥潭的开始... (想要吸取经验的小伙伴可以慢慢往下看,想要解决方案的直接看最后!) 一.一开始我以为直接 ...