题目:
输入一个链表,输出该链表中倒数第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();
}
}