算法:查找链表中倒数第k个节点

来源:互联网 发布:信息化校园大数据引领 编辑:程序博客网 时间:2024/06/18 00:16

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。既然不能从尾结点开始遍历这个链表,我们还是把思路回到头结点上来。假设整个链表有n个结点,那么倒数第k个结点是从头结点开始的第n-k-1个结点(从0开始计数)。如果我们能够得到链表中结点的个数n,那我们只要从头结点开始往后走n-k-1步就可以了。如何得到结点数n?这个不难,只需要从头开始遍历链表,每经过一个结点,计数器加一就行了。这种思路的时间复杂度是O(n),但需要遍历链表两次。第一次得到链表中结点个数n,第二次得到从头结点开始的第n­-k-1个结点即倒数第k个结点。如 果链表的结点数不多,这是一种很好的方法。但如果输入的链表的结点个数很多,有可能不能一次性把整个链表都从硬盘读入物理内存,那么遍历两遍意味着一个结 点需要两次从硬盘读入到物理内存。我们知道把数据从硬盘读入到内存是非常耗时间的操作。我们能不能把链表遍历的次数减少到1?如果可以,将能有效地提高代码执行的时间效率。如果我们在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针保持不动;在第k-1步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。这种思路只需要遍历链表一次。对于很长的链表,只需要把每个结点从硬盘导入到内存一次。因此这一方法的时间效率前面的方法要高。


public Node findElem(Node head,int k){

if(k<1 || head == null)

{

returnnull;

}

Node p1 = head;

Node p2 = head;

for (int i = 0; i < k - 1; i++) { //前移k-1步

if(p1.next != null){

p1 = p1.next;

}else {

returnnull;

}

}

while (p1 != null) {

p1 = p1.next;

p2 = p2.next;

}

return p2;

}



阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 展示馆 上海城市规划展示馆 展笔顺 展的笔顺 展字笔顺 火的展笔顺怎么写 展笔顺怎么写 展米机 展米机多少钱一台 展米机图片 展组词 展的组词 展字组词 展的组词是什么 血压计臂式好还是腕式好 自行走直臂式高空作业平台 自行直臂式高空作业平台 自行直臂式高空作业车 曲臂式高空作业车租赁 曲臂式高空作业车出租 曲臂式升降平台厂家 多利卡摆臂式垃圾车 墙壁式悬臂吊 移动式悬臂吊 鱼跃臂式电子血压计价格 血压计上臂式好还是手腕式好 展色剂 上海展览会时间表 展览会时间表 国际乐器展览会 进口食品展览会 图画展览会 电子展览会 汽车饰品展览会 古玩古董展览会 科技展览会 家装设计展览会 糖果展览会 世界家具展览会 进口商品展览会 坚果炒货展览会