1. 本题知识点
双指针
2. 题目描述
输入一个链表,输出该链表中倒数第 k 个结点。
3. 解题思路
-
设置两个指针 P1 和 P2,让它们都指向链表第一个结点
-
先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。(假设 K = 3,N = 5)
-
然后让 P1 和 P2 同时移动,当 P1 移动到链表结尾时,P2 移动到第 N - K 个结点处,该位置就是倒数第 K 个结点。
4.代码
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
/**
* 输入一个链表,输出该链表中倒数第 k 个结点。
*
* @param head
* @param k
* @return
*/
public ListNode FindKthToTail(ListNode head, int k) {
// 如果链表为空,返回 null
if (head == null) {
return null;
}
ListNode p1 = head;
ListNode p2 = head;
// 让 p1 移动 k 个节点
while (k > 0 && p1 != null) {
p1 = p1.next;
k--;
}
// 如果没有倒数第 k 个结点,返回 null
if (k > 0) {
return null;
}
// 让 p1 和 p2 同时移动,直到 p1 移动到链表结尾
while (p1 != null) {
p1 = p1.next;
p2 = p2.next;
}
// 返回 p2,它就是倒数第 k 个节点。
return p2;
}
}