- C#程序员面试算法宝典
- 猿媛之家组编 赵大有等编著
- 704字
- 2021-03-29 04:07:34
1.5 如何找出单链表中的倒数第k个元素
难度系数:★★★☆☆ 被考察系数:★★★★☆
题目描述:
找出单链表中的倒数第 k 个元素,例如给定单链表:1->2->3->4->5->6->7,则单链表的倒数第k=3个元素为5。
分析与解答:
方法一:顺序遍历两遍
主要思路:首先遍历一遍单链表,求出整个单链表的长度 n,然后把求倒数第 k 个元素转换为求顺数第 n-k 个元素,再去遍历一次单链表就可以得到结果。但是该方法需要对单链表进行两次遍历。
方法二:快慢指针法
由于单链表只能从头到尾依次访问链表的各个结点,所以,如果要找链表的倒数第k 个元素,也只能从头到尾进行遍历查找,在查找过程中,设置两个指针,让其中一个指针比另一个指针先前移k步,然后两个指针同时往前移动。循环直到先行的指针值为null时,另一个指针所指的位置就是所要找的位置。程序代码如下:
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_48_03.jpg?sign=1739171062-M59N735jiK1E0fagSspOYdEdm8kHQUnn-0-0536048d8311727fef8ba19343fbb9b3)
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_49_01.jpg?sign=1739171062-YB5qyrjZ8ij1sQcddOLk2nCoKODuMbzb-0-6adf4bbdecee92bac235620d70835e35)
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_50_01.jpg?sign=1739171062-hotnjqF6Cl271Di7nuI1bp2nHjlbbtbt-0-12b0adb7cf03121153f9b0e0a6b1c408)
程序的运行结果为
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_50_02.jpg?sign=1739171062-op6LK6U2lboNcuR19KQXzOrn8sJi4jQ1-0-43291120800dec6b94e77dc55fdb547d)
算法性能分析:
这种方法只需要对链表进行一次遍历,因此,时间复杂度为O(n)。另外由于只需要常量个指针变量来保存结点的地址信息,因此,空间复杂度为O(1)。
引申:如何将单链表向右旋转k个位置
题目描述:给定单链表1->2->3->4->5->6->7,k=3,那么旋转后的单链表变为5->6->7->1->2->3->4。
分析与解答:
主要思路:1)首先找到链表倒数第k+1个结点slow和尾结点fast(如下图示);2)把链表断开为两个子链表,其中,后半部分子链表结点的个数为k;3)使原链表的尾结点指向链表的第一个结点;4)使链表的头结点指向原链表倒数第k个结点。
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_50_03.jpg?sign=1739171062-3o2BRBA3Vcp6jJohfnrNqNcKpWAhhYt1-0-37b38f61e680b00f497d9ac095b37fe0)
实现代码如下:
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_50_04.jpg?sign=1739171062-QovqCEcwcO0d7bnOl20cs0PgGGGiQYj3-0-5cb076e2ada9e8fa5e42c3aafd6091f1)
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_51_01.jpg?sign=1739171062-XGnCM1mN9GlbrQDnGgaXCd13VzqNK4Sl-0-6a0357723949d24660146ceefe7d0ec8)
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_52_01.jpg?sign=1739171062-C4T9qJHYbfh5rohwVUlokqHpyirqYseu-0-2f8d8917df2c5c0a71effbf64be1d085)
程序的运行结果为
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_52_02.jpg?sign=1739171062-aUQgJmIs3fFgVx4GWnMUUsxYPbWsIeAk-0-ab925bf6a51ff37ad6484c8670432429)
算法性能分析:
这种方法只需要对链表进行一次遍历,因此,时间复杂度为O(n)。另外由于只需要几个指针变量来保存结点的地址信息,因此,空间复杂度为O(1)。