题解 | #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String a;
StringBuffer string = new StringBuffer();
char[] chs;
int[] linked;
int n, i, j = 0, k = 0, tmp, l;
try {
while ((a = r.readLine()) != null && !a.isEmpty()) {
chs = a.toCharArray();
l = chs.length;
i = 0;
n = 0;
while (i < l) {//有多少节点
n *= 10;
n += chs[i] - '0';
i++;
}
linked = new int[n];//初始化节点数组
a = r.readLine();
chs = a.toCharArray();
l = chs.length;
i = 0;
j = 0;
k = 0;
tmp = 0;
while (i < l) {//获得节点值
if (chs[i] == ' ') {
if (k > 0) linked[j++] = tmp;
tmp = 0;
k = 0;
i++;
continue;
}
k++;
tmp *= 10;
tmp += chs[i] - '0';
if (i == l - 1) linked[j] = tmp;
i++;
}
a = r.readLine();
chs = a.toCharArray();
l = chs.length;
i = 0;
k = 0;
while (i < l) {//倒数第几个节点
k *= 10;
k += chs[i] - '0';
i++;
}
i = 1;
l = linked.length;
LinkedNode head = new LinkedNode(linked[0]);
LinkedNode point = head;
while (i < l) {//链表赋值
LinkedNode node = new LinkedNode(linked[i]);
point.next = node;
point = node;
i++;
}
LinkedNode nodeK = twoPoint(head, k);
string.append(nodeK == null ? 0 :
nodeK.value).append("\n");//如果为空,输出0
}
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.print(string);
}
//快慢指针先后遍历链表,快指针先行k步
private static LinkedNode twoPoint(LinkedNode head, int rec) {
int i = 0;
LinkedNode quick = head;
LinkedNode slow = head;
LinkedNode node;
while (i < rec) {
if (quick != null) {
node = quick.next;
quick = node;
i++;
} else {
slow = null;
break;
}
}
while (quick != null) {
node = quick.next;
quick = node;
node = slow.next;
slow = node;
}
return slow;
}
}
class LinkedNode {
int value;
LinkedNode next;
public LinkedNode(int value) {
this.value = value;
this.next = null;
}
}
