1. 链表倒数第 K 个结点
输入一个链表,输出该链表中倒数第 K 个结点
2. 解法
2.1 正向遍历法
正向遍历链表,确定其长度N
,再从头遍历 N-K
个结点,即可获得倒数第 K 个结点
public ListNode findKthToTail(ListNode head, int k) {
if (null == head || k < 0) {
return null;
}
// 链表长度记录
int size = 0;
ListNode root = head;
while (root != null) {
root = root.next;
size++;
}
if (size < k) {
return null;
}
ListNode p = head;
for (int i = 0; i < size - k; i++) {
p = p.next;
}
return p;
}
2.2 双指针法
使用两个指针ahead
和 follow
,首先让 ahead
指针从头遍历 K-1
个节点后,follow
指针开始从头遍历。 ahead
指针到达链表尾部则遍历结束,此时follow
指针停下的位置即为倒数第 K 个结点
public ListNode findKthToTail(ListNode head, int k) {
if (null == head || k < 0) {
return null;
}
//两个指针都指向头结点
ListNode ahead = head;
ListNode follow = head;
//记录节点总个数
int count = 0;
int n = k;
//ahead 指针先跑,并且记录节点数,当 ahead 指针跑了k-1个节点后,follow指针开始跑,
//当 ahead 指针跑到最后时,follow 所指就是倒数第k个节点
while (ahead != null) {
ahead = ahead.next;
count++;
if (k < 1) {
follow = follow.next;
}
k--;
}
//如果节点总个数小于 K,则返回空
if (count < n) {
return null;
}
return follow;
}