题干
算法思路:这道题采用双指针法比较方便,因为只需要一次遍历就可解决。
① 设置两个指针p和q,在一开始时同时指向首结点,然后使得p指针先移动k-1个结点,q指针此时不动,此时p和q距离k-1个结点。
② 接着同时移动p指针和q指针,直到p指针指向尾结点,而此时p和q,距离为k-1。那么q指针指向的结点就是倒数第k个结点,访问这个结点data,算法完成。
typedef int Element; //链表的数据类型定义
typedef struct LNode{ //链表结点的结构的定义
ElemType data; //结点数据
struct LNode *link; //结点链接指针
}LNode,*LinkList;
int Search_k(LinkList list,int k){
LNode *p = list->link; //指针p指向第一个结点
LNode *q = list->link; //指针q指向第一个结点
int count = 0;
while(p!=NULL){ //访问全部的结点
if (count<k) count++; //开始计数,先移动p指针k个结点(包含第一个结点)。直至p,q保持k-1个结点
else q=q->link;
p=p->link;
}//while
if (count<k) //单链表不够k个结点时,返回0
return 0;
else: //打印q的数据,返回1
{
printf("%d",q->data);
return 1;
}
}