題目描述
輸入一個單向鏈表,輸出該鏈表中倒數第k個結點,鏈表的倒數第0個結點爲鏈表的尾指針。
輸入描述
輸入說明
1 輸入鏈表結點個數
2 輸入鏈表的值
3 輸入k的值
輸出描述
輸出一個整數
輸入例子
8 1 2 3 4 5 6 7 8 4
輸出例子
4
算法實現
import org.omg.SendingContext.RunTime;
import java.util.List;
import java.util.Scanner;
/**
* All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
while (scanner.hasNext()) {
int n = scanner.nextInt();
ListNode head = new ListNode(0);
ListNode prev = head;
while ((--n) >= 0) {
prev.next = new ListNode(scanner.nextInt());
prev = prev.next;
}
int k = scanner.nextInt();
System.out.println(findKthToTail(head, k));
}
scanner.close();
}
/**
* 找倒數第k個結點,假設k是有效的
*
* @param head
* @param k
* @return
*/
private static ListNode findKthToTail(ListNode head, int k) {
ListNode prev = head;
while (--k >= 0 && prev != null) {
prev = prev.next;
}
// 說明k已經超出了鏈表的長度
if (prev == null) {
throw new RuntimeException("k=" + k + "不合法");
}
// 註釋掉的纔是正確答案
// while (prev != null) {
// prev = prev.next;
// head = head.next;
// }
// 若是從0開始,即鏈表尾部第一個是倒數第0個那麼下面是正確的
while (prev.next != null) {
prev = prev.next;
head = head.next;
}
return head;
}
private static class ListNode {
int v;
ListNode next;
ListNode(int v) {
this.v = v;
}
@Override
public String toString() {
return "" + v;
}
}
}