递归求单链表中倒数第k个结点
这次算法课留的作业之一,递归求单链表中倒数第k个结点
又是有关单链表的,正好用上上次做逆置的类了(逆置)
说下我最初的想法吧。自己还是单纯,脑子磨不过这个弯来。
- 先用一个指针flag遍历整个单链表得到长度length
- 用length-k,得到第二个指针index移动到目标结点(倒数第k个)的次数
- 设置一个计数器count。index每移动一次,count便+1。
- 直到count==length-k,便返回index所指。
缺点:效率太低,同样操作要执行两次for,可以进行优化。
第二种方法是把两个指针变成一个类似于滑块一样的结构,flag先出发,index后出发,步距为n-1。两个指针保持一定的距离,并同时运动。等到flag到达最后一个时候,index所指结点就是倒数第n个结点。
(很容易理解,如果index和flag同时开始运动,步距为0,flag到底时index所指即为倒数第1个;flag先后移一个结点,步距相差1,flag到底时index所指为倒数第2个结点,以此类推…)
/*
* @Title getReciprocal
* @Description 求倒数第n个,递归中n表示index移动到目标结点的次数为length-n
* flag先移动,每次都--n,直到n=1,flag与index一同移动,flag到尾巴时index即为所求
* @author 滑技工厂
* @Date 2020/3/6
* @param [flag, index, n]
* @return cn.huaji.main.Node
* @throws
*/
public static Node getReciprocal(Node flag, Node index, int n) {
//第一个指针到尾巴,就返回指针2
if (flag.next == null) {
return index;
}
if (n <= 1) {
//n=1时index开始移动
index = index.next;
}
flag = flag.next;
return getReciprocal(flag, index, --n);
}
这篇看题到完成也写了一天了,如果你觉得对你有帮助就点个小赞👍吧。
你的鼓励是对我的最大支持!
最后吉祥物镇楼