这道题有很多解法,我觉得最经典的一个解法是用两个指针做成一个K长度的尺子,然后让这个尺子在链表上从头到尾移动,当尺子末端到达链表末端的时候,尺子首端指的就是倒数第K个节点。
例如:有链表 a b c d e f
要拿到倒数第三个节点(也就是d),则可以用两个指针做一个长度为三的尺子(把下划线看作长度为3的尺子),尺子首端是a,末端是c,然后让这个尺子往后移动,当尺子末端到达 f 的时候,尺子首端指的就是倒数第三个节点 d
那么怎么做一个长度为K的尺子呢,很简单,先创建两个指针cur,last,先让这两个指针都指向链表第一个节点,然后让第二个指针 last 往后走K-1步,这个时候让两个指针同时往后移动,就像一个尺子一样,当第二个指针移动到链表末尾,第一个指针指的就是倒数第K个节点,具体代码如下
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function FindKthToTail(head, k) {
if(head === null || k <= 0) //判断链表是否为空、K值是否超出范围
return null;
var cur = head; //先让两个指针都指向头节点
var last = head;
for(var i = 0; i < k-1; i++) { //让第二个指针走K-1步
if(last.next != null) {
last = last.next //如果K的值是3,那么循环完后last的值就是链表上下标为2的值
}else {return null}
}
while(last.next != null) { //让两个指针同时移动,当第二个指针移动到末尾时停止
cur = cur.next;
last = last.next;
}
return cur; //返回倒数第K个节点
}