题解 | #输出单向链表中倒数第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; } }