Java 每日一题 9 附答案 链表

大家好,我是青空。

快来和青空看看今天的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值