题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
题目解答
遍历两次链表
var getKthFromEnd = function(head, k) {
var p = head;
var numOfNode = 1;
while(p.next!=null){
p = p.next;
numOfNode++;
}
if(numOfNode>=k){
var goHead = numOfNode - k + 1;
var p =head;
var numOfNode = 1;
while(goHead > numOfNode){
p = p.next;
numOfNode++;
}
return p;
}
};
首先顺序遍历链表,计算出链表中节点的总个数numofNode。然后计算倒数第k个节点是正数第几个节点,再次遍历链表到对应的节点。
遍历一次链表
var getKthFromEnd = function(head, k) {
//head为空
if(head==null||k==0){
return 0;
}
var pBegin = head;
var pEnd = head;
var step = k-1;
while(pEnd.next!=null&&step){
pEnd = pEnd.next;
step--;
}
while(pEnd.next!=null){
pBegin = pBegin.next;
pEnd = pEnd.next;
}
return pBegin;
};
定义两个指针,当后一个指针指向最后一个节点时,前一指针刚好指向倒数第k个节点。要实现这一想法,两个指针必须间隔k-1。
先提前移动其中一个指针k-1步,然后两个指针一起向前移动,当在前的指针移动到链表尾部,后一指针将刚好移动到对应位置。