大家好,我是青空。
快来和青空看看今天的Java每日一题吧
题目
实现一个算法,找出单向链表中倒数第k个结点。
解法预警
不建议直接看下面答案,可以自己先思考一下怎么处理再看大看比较合适
解法
下面会以递归和非递归的方式解决这个问题。一般来说,递归解法更简洁,但效率比较差。 例如,就这个问题来说,递归解法的代码量大概只有迭代解法的一半,但要占用O(n)空间,其中 n为链表结点个数。
注意,在下面的解法中,k定义如下:传入k = 1将返回最后一个结点,k = 2返回倒数第2 个结点,依此类推。当然,也可以将k定义为k = 0返回最后一个结点。
解法 1:链表长度已知
若链表长度已知,那么,倒数第k个结点就是第(length - k)个结点。直接迭代访问链表就能找到这个结点。不过,这个解法太过简单了,不大可能是面试官想要的答案。
解法 2:递归
这个算法会递归访问整个链表,当抵达链表末端时,该方法会回传一个置为0的计数器。 之后的每次调用都会将这个计数器加1。当计数器等于k时,表示我们访问的是链表倒数第k个元素。
实现代码简洁明了,前提是我们要有办法通过栈“回传”一个整数值。可惜,我们无法用一 般的返回语句回传一个结点和一个计数器,那该怎么办?
一种方法是对这个问题略作调整,只打印倒数第k个结点的值。然后,直接通过返回值传回计数器值。
public static int nthToLastR1(LinkedListNode head, int n) {
if (n == 0 || head == null) {
return 0;
}
int k = nthToLastR1(head.next, n) + 1;
if (k == n) {
System.out.println(n + "th to last node is " + head.data);
}
return k;
}
https://mp.weixin.qq.com/s/AbvYVt30H-Ze8-BqmHFxWA