算法思想
第一种(普通算法):遍历链表,输出链表的长度,比较链表长度与k的关系,若长度小于k则失败,返回数值0。如果长度大于k,将指针移动到第倒数第k个位置,输出data的值,返回1即可。
typedef int Elemtype;//链表数据结构类型定义
typedef struct LNode{//链表结构体定义
Elemtype data;
struct LNode *link;
}LNode,*LinkList;
int sertcg(LinkList list ,int k){
LNode *p=list->link;//指针p指向第一个结点
int i=0,j=0;
while(p!=NULL){//遍历链表确定链表长度
p=p->next;
i++;
}
if(i<k) return 0;//比较链表长度与k之间的关系,k值非法查找失败
else{
p=list->link;//指针重新开始遍历
if(j<i-k)//找到倒数第k个位置的元素
j++;
p=p->link;
}
printf(“%d”,p->data);//返回数据元素的值
return 1;//查找成功
}
第二种(优秀算法):定义两个指针变量p和q,初始时均指向头结点的下一个结点,p指针先移动,q指针不变,如果此时p移动到第k个位置时,p,q同步移动,当p移动到最后一个结点时q所指向的结点为倒数第k个结点。
typedef int Elemtype;//链表数据结构类型定义
typedef struct LNode{//链表结构体定义
Elemtype data;
struct LNode *link;
}LNode,*LinkList;
int serch_t(LinkList list){
LNode *p=list->link,*q=list->link;//p,q指针分别指向链表第一个结点
int count=0;
while(p!=NULL){//如果此时P不为空
if(count<k) count++;c//计数,如果count<k只移动p
else q=q->link;//p,q同步移动
p=p->link;
}
if(count<k) return 0;//k值非法查找失败返回0
else {
printf(“%d”,q->data);//查找成功输出值,返回1。
return 1;
}
}