
首先想到的可能是做两次遍历,第一次得到链表长度,第二次找到倒数第k个元素。但是这样的时间复杂度达到了O(n2)。
实际上,还有一个更加高效的算法:
设置两个指针p1、p2,p1指向第一个结点,p2指向第k-1个结点,然后让两个结点同时往后走,当p2->link=null时,即p2指向链表尾结点时,p1指向的就是链表中倒数第k个元素。
代码:
bool find(Linklist &list,int k){//遍历n次
LNode *p1,*p2;
p1=p2=list->link;
for(i=0;i<=k-1;i++)
{
p2=p2->link;
}
while(p2->link){
p1=p1->link;
p2=p2->link;
}
cout<<"倒数第k个数:"<<p2->data<<endl;
}
时间复杂度O(n)
高效查找链表倒数第K个元素
本文介绍了一种高效查找链表倒数第K个元素的算法,通过设置两个指针,先让其中一个指针向前移动K-1个位置,然后两个指针同步移动,当第二个指针到达链表尾部时,第一个指针正好指向倒数第K个元素。此方法的时间复杂度为O(n),比传统方法更优。
596

被折叠的 条评论
为什么被折叠?



