剑指offer面试题15-链表中倒数第k个节点

题目:

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如一个链表有6个节点,从头结点开始他们的值依次是1、2、3、4、5、6,这个链表的倒数第3个节点的是值为4的节点。

链表结构如下:

package com.aii.algorithm;

public class Node {
	int value;
	Node next;

	public Node(int value) {
		this.value = value;
	}

	@Override
	public String toString() {
		return "Node [value=" + value + ", next=" + next + "]";
	}

}


比较好的方法就是用2个指针:一前以后,前后相差n-1,当前面的指针到了最后一个,后面的那个指针刚好指向我们要的那个对象。


package com.aii.algorithm;

public class FindKthToTail {

	public static Node find(Node head, int n) {
		// 倒数第几个数,肯定是从1开始的
		if (n < 1) {
			exception();
		}

		Node front = head;
		Node after = head;

		// 需要倒数n个,那么前面的指针就要比后面的指针早开始走n-1步
		for (int i = 0; i < n - 1; i++) {
			if (front != null) {
				front = front.next;
			} else {
				// 从0到n-1的遍历,如果出现front==null,说明倒数的n超出了字符串的长度
				exception();
			}
		}

		// 然后前后2个指针再开始一起走
		while (front != null) {
			// 直到前面的那个指针,他指向的节点的next为空,此时说明已经到达最后一个节点,则停止。
			if (front.next == null) {
				break;
			}
			front = front.next;
			after = after.next;
		}
		return after;
	}

	private static void exception() {
		throw new RuntimeException();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值