题目描述:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例: 给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5.
题目分析:给定一个k值,需要返回以倒数第k个节点为头节点的子链表。因为单链表只能从头向后遍历,因此可以引入两个引用fast和low,使fast先走k步,low再开始走,可以保证fast到low之间的相对距离永远是k,则当fast走到null时,low恰好会指向倒数第k个节点。
1---->2---->3---->4---->5---->null //假设k=2,需要找到倒数第二个节点
f0
l0
----------------------------------
f1
l1
----------------------------------
f2
l2
----------------------------------
f3
l3
注意:题目中给的k值不一定是合法的,所以需要验证。
代码实现:
package LeetCode;
//倒数第k个节点
public class Offer22 {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast = head,low = head;
for (int i = 0; i <k; i++) {
fast = fast.next;
}
//当fast比low快k步时,让low和fast同时向后移动,直到fast为空
while(fast != null){
low = low.next;
fast = fast.next;
}
return low;
}
}