JavaScript版《剑指offer》刷题(13)链表中倒数第k个结点
2019-06-21 09:36
99 查看
1.题目描述
输入一个链表,输出该链表中倒数第k个结点。
2.思路
题目:
输入一个链表,输出该链表中倒数第k个节点。
要求:
为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。
例如:
一个链表有6个节点,从头节点开始,他们的值依次是1、2、3、4、5、6.这个链表的倒数第三个节点是值为4的节点。
通用思路:
当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表,都是从头节点出发。
可以让其中一个指针遍历的速度快一些(比如一次走两步,找中间节点时),或者让它现在链表上走若干步。
3.代码
先看一个遍历两次链表的解法:
通过遍历一次获取链表长度,然后根据k确定索引,然后再次遍历链表
function kNodeInList(head, k) { if(head === null || k === 0) { return null; } let len = 0; let tempNode = head; while(tempNode) { tempNode = tempNode.next; ++len; } if(k > len) { return null; } let index = len - k + 1; result = head; for(let i=1; i< index; ++i) { result = result.next; } return result; }
再看一种解法:
//只遍历一次链表,用两个指针,他们之间的距离相差k-1
//尾指针先走k-1步,到第k步,两个指针一起走。当尾指针达到链表尾节点时,头指针的位置就是倒数第k个
也就是两个点之间距离固定,从而尾指针到尾节点时候,头指针因为与尾指针距离固定,所以从尾指针看来,头指针就是倒数的第k个
function kNodeInList(head, k) { if(head === null || k === 0) { return null; } let pHead = tail; let pTail = tail; for(let i=0; i<k-1; ++i) { if(pTail.next) { pTail = pTail.next; } else { return null; } } while(pTail.next) { pTail = pTail.next; pHead = pHead.next; } return pHead; }
参考文章:
https://www.cnblogs.com/echovic/p/6430678.html
https://www.geek-share.com/detail/2719726940.html
https://github.com/DavidChen93/-offer-JS-/blob/master/22.1 链表中倒数第k个节点.js
相关文章推荐
- 剑指Offer系列---(2)求链表中的倒数第k个结点
- 链表中倒数第k个结点-剑指Offer(Java语言)
- 《剑指offer》链表中倒数第k个结点
- 剑指offer——链表中倒数第k个结点(队列实现)
- 13、链表中倒数第K个结点
- 剑指offer(十四,十五)链表中倒数第k个结点,反转链表
- 13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。
- 剑指Offer:链表中倒数第k个结点(java版)
- 剑指Offer面试题14使数组中的奇数在偶数前,面试题15链表倒数第k个结点
- 链表中倒数第k个结点 - 牛客剑指offer 13
- 剑指offer系列之13:链表中倒数第k个节点
- 《剑指offer》:[3]得到链表中倒数第K个结点
- 《剑指offer》-输出链表中倒数第k个结点
- 剑指Offer系列-面试题15:链表中倒数第K个结点
- 剑指offer——链表中倒数第k个结点(相关扩展题不错)
- 剑指offer面试题15:链表中倒数第k个结点
- 《剑指Offer》 链表中倒数第k个结点
- 剑指offer 15 链表中倒数第k个结点
- [剑指offer学习心得]之:链表中倒数第k个结点
- 剑指offer系列源码-链表中倒数第k个结点