已知一个带有表头结点的单链表,结点结构为:
data | link |
---|
假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中
倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的 data 域的值,并返回 1;否则,只
返回 0。要求:
⑴ 描述算法的基本设计思想;
⑵ 描述算法的详细实现步骤;
⑶ 根据设计思想和实现步骤,采用程序设计语言描述算法(使用 C、C++或 Java 语言实现),关键之处请
给出简要注释。
#include<stdio.h>
#include<stdlib.h>
typedef int Ele; //链表数据的类型定义
typedef struct Lnode{ //链表结点的类型定义
Ele data; //数据结点
Lnode *link; //结点链接指针
}Lnode,*LinkList;
LinkList TailCreate(LinkList &L){
int x;
L=(Lnode*)malloc(sizeof(Lnode));
LinkList r=L,s;
int i=0;
while(i++<5){
scanf("%d",&x);
s=(Lnode*)malloc(sizeof(Lnode));
s->data=x;
r->link=s;
r=s;
//scanf("%d",&x);
}
r->link=NULL;
return L;
}
void Print(LinkList L){
L=L->link;
while(L!=NULL){
printf("%d ",L->data);
L=L->link;
}
}
int Findn(LinkList L,int k){
//查找链表L倒数第K个值,并输出该节点的值
LinkList p=L->link,q=L->link;//p,q指向第一个结点
int count =0;
while(p!=NULL){ //遍历链表直到最后一个元素
if(count<k) count++;//计数,若count<k,只移动p
else q=q->link;
p=p->link; //p移动到第k个后,q开始移动
}
if(count<k) return 0;//查找失败,返回0
else {//查找成功,输出结点域的值,并返回1
printf("%d\n",q->data);
return 1;
}
}
int main(){
LinkList L;
TailCreate(L);
// Print(L);
int k;
scanf("%d",&k);
int s=Findn(L,k);
printf("%d\n",s);
}