找出单链表中的倒数第k个元素
解题思路:
为了求出链表中的倒数第k个元素,最容易想到的方法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果。不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素。
如果沿从头至尾的方向从链表中的某个元素开始,遍历k个元素刚好到达链表尾,那么元素就是要找的倒数第k个元素。设计如下:依次对链表的每一个结点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,直到找到那个倒数第k个元素。此种方法将对同一批元素进行反复多次的遍历,对于链表的大部分元素而言,都要遍历k个元素,如果链表长度为n,则该算法时间复杂度为O(kn)级,效率太低。
存在另一种更高效的方法。在查找过程中,设置两个指针,让其中一个指针比另一个指针先前移k-1步,然后两个指针同时往前移动。循环直到先行的指针指为NULL时,另一个指针所指的位置就是所要找的位置
程序如下:
public Node findElem(Node head,int k){
if(k<1 || head == null)
{
return null;
}
Node p1 = head;
Node p2 = head;
for (int i = 0; i < k - 1; i++) { //前移k-1步
if(p1.next != null){
p1 = p1.next;
}else {
return null;
}
}
while (p1 != null) {
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
Github源码地址
https://github.com/GeniusVJR/Algorithm-and-Data-Structure/tree/master/单链表的倒数第k个元素
时间: 2024-10-07 06:55:29