首先想到的可能是做两次遍历,第一次得到链表长度,第二次找到倒数第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)