本题目摘自《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个元素的更多相关文章

  1. 【BAT经典算法面试题系列】求和为n的连续正整数

    马上就要到9月份了,意味着一年一度的秋招就要开始了,相信不论是正在实习的童鞋还是马上就要找工作的童鞋,BAT无疑是国内的"明星企业",是每个学计算机的小伙伴们心之向往的企业,但是呢 ...

  2. 前端常见算法面试题之 - 从尾到头打印链表[JavaScript解法]

    题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值 实现思路 前端工程师看到这个题目,直接想到的就是,写个while循环来遍历链表,在循环中把节点的值存储在数组中,最后在把数组倒序后,遍 ...

  3. java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载

    从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 1,张三,28 2,李四,35 3,张三,28 4,王五,35 5,张三,28 6,李四,35 7,赵六,28 ...

  4. 《剑指offer》面试题15 链表中的倒数第k个节点 Java版

    书中方法:用两个节点一次遍历求得倒数第k个节点.注意头节点为空,k<=0,k大于节点个数的情况. public ListNode find(ListNode head, int k){ if(h ...

  5. 华为Python 算法面试题

    华为算法面试题 """ 算法题: 提供一个序列,完成对这个序列的分割.要求分割后的两个序列彼此差值最小 实现函数,返回两个序列 """ de ...

  6. Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  7. 【转】Twitter算法面试题详解(Java实现)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://androidguy.blog.51cto.com/974126/1319659 ...

  8. 算法面试题:一个List<Student>,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!

    算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点! 解题思路 这是群里某位小伙伴去面试碰到的面试题,从题目本身来看,面试官应该是要考察面试者对泛型 Lis ...

  9. LeetCode 算法面试题汇总

    LeetCode 算法面试题汇总 算法面试题 https://leetcode-cn.com/problemset/algorithms/ https://leetcode-cn.com/proble ...

随机推荐

  1. 洛谷 P3833 [SHOI2012]魔法树

    题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点 ...

  2. 构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境

    构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境 整个环境的结构图. 一.准备工作 gitlab和harbor我是安装在kubernetes集群外 ...

  3. 第10项:重写equals时请遵守通用约定

      重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...

  4. Linux低权限用户记录ssh密码

    0x01 场景 现在有个攻击场景,就是你拿到了linux外网服务器的webshell,要做内网渗透前肯定要收集信息.其中可以做的一个工作是重新编译ssh来记录管理员的密码信息,信息可以用来撞其他机器的 ...

  5. [NOIp2012] luogu P1083 借教室

    该*的英语,这么长还要背. 题目描述 你有 nnn 个数 ai{a_i}ai​,mmm 次操作,每次操作将 [l,r][l,r][l,r] 区间的每个数减去 ccc.要求任何时刻 ∀x∈[1,n]\f ...

  6. TCC推导过程

    svn 账号 yuanzn 密码:TCH5mb 项目分层 MapperDao 数据校验 throw new CloudBaseRuntimeException Helper 数据转换 manager ...

  7. pycharm在进行debug时不小心把console关闭了,恢复console的办法

    点击下图中右边的箭头就恢复了 此时可看到console已恢复

  8. 【MongoDB详细使用教程】二、MongoDB基本操作

    目录 数据类型 数据库操作 集合操作 数据操作 增 查 改 修改整行 修改指定字段的值 删 数据类型 MongoDB常见类型 说明 Object ID 文档ID String 字符串,最常用,必须是有 ...

  9. 百万年薪python之路 -- 软件的开发规范

    一. 软件的开发规范 什么是开发规范?为什么要有开发规范呢? 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目 ...

  10. LaTeX常用篇(一)---公式输入

    目录 1. 序言 2. 命令介绍 3. 公式输入 3.1 无编号公式 3.2 有编号公式 更新时间:2019.10.02 1. 序言   当我们首次在文档中输入公式的时候,我们首先想到的是word,毕 ...