1 // 思想很巧妙,一个快指针,一个慢指针,二者相隔k-1
2 public ListNode FindKthToTail(ListNode head, int k) {
3 if (head == null || k <= 0) {
4 return null;
5 }
6 ListNode p = head;
7 // p是快指针,让p先走k-1步
8 for (int i = 0; i < k - 1; i++) {
9 if (p.next != null) {
10 p = p.next;
11 } else {
12 return null;
13 }
14 }
15 ListNode pre = head;
16 // pre是慢指针,快指针走完k-1步以后,p和pre一起以相同的速度走
17 while (p.next != null) {
18 p = p.next;
19 pre = pre.next;
20 }
21 // 此时,p指向最后一个节点,pre指向倒数第k个节点
22 return pre;
23 }