这是一道经典的链表题目,题目虽简单,思路却很清奇。
1 题目描述
输入一个链表,输出该链表中倒数第k个结点。
2 思路
- 用两个指针,一个指针先出发
- 当第一个指针到达第k个节点的时候,第二个指针才出发
- 当第一个指针到达结尾的时候,第二个指针正好在倒数第k个
- 因为二者之间相隔了k个节点(包括这两个指针正指向的节点)
3 java代码
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
// 初始条件
if (head == null || k == 0) {
return null;
}
// 用两个指针,一个指针先出发
// 当第一个指针到达第k个节点的时候,第二个指针才出发
// 当第一个指针到达结尾的时候,第二个指针正好在倒数第k个
// 因为二者之间相隔了k个节点(包括这两个指针正指向的节点)
// 定义两个指针
ListNode p1 = head;
ListNode p2 = head;
// 先将第一个指针移到第k个节点,也就是向后移动k-1次
while (k > 1) { // 判定成功的是从k到2,一共k-1次
--k;
if (p1.next != null) {
p1 = p1.next;
} else {
// 还没移到第k个节点,下一个节点就为空了,说明链表不足k个节点,返回null
return null;
}
}
// 两个指针同时移动,直到第一个指针到达最后一个节点
while (p1.next != null) {
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}