小算法:查找出单链表中倒数第k个元素

为了找到单向链表的倒数第k个元素:
1.最容易想到的就是先遍历一遍链表求出链表的长度len,求倒数第k个元素转化为求正的数第 len-k 个元素,两次遍历确实可以得到所求元素,但为免有些麻烦,进行优化
2.如果延从头至尾的方向进行遍历,如果从一个元素开始再向后遍历k个元素到达链表尾,那么该元素就是要找的倒数第k个元素,根据这个特点可以设计如下算法:从头结点开始,依次对每个节点进兴这样的测试,遍历k个元素看看是否到达末尾,直到找到这个元素。此方法对于链表中的大部分元素需要向后遍历k个元素,如果链表长度为n 则时间负载度为O(kn)级,效率太低。
3.存在另一种高效的方法:设置两个指针都指向头节点 。让第一个指针先从头结点往后移动k-1步,然后和另一个节点一起开始向后遍历,当先行的指针的为null时 ,后续指针位置即为要求位置:代码如下
Node findElem(Node head,int k){
if(k<1)
return null;
Node p1=head;
Node p2=head;
for (int i=0;i<k-1;i++){//先行节点先走k-1步
p1=p1.next;
}
if(p1==null){
System.out.println(k+“不合法”);
return null
}
while(p1.next!=null){
p1=p1.next;
p2=p2.next;
}
return p2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值