一、题目要求
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL
。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
二、代码编写
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}lnode,*linklist;
linklist creat(int *i)
{
linklist l,p,s;
l=(linklist)malloc(sizeof(lnode));
int e;
p=l;
scanf("%d",&e);
int n=0;
while(e>=0)
{
s=(linklist)malloc(sizeof(lnode));
s->data=e;
p->next=s;
p=s;
scanf("%d",&e);
n++;
}p->next=NULL;
*i=n;
return l;
}
void print(linklist l,int n,int i)
{
linklist p;
p=l;
if(n<1||n>i) printf("NULL");
else {
for(int j=0;j<i-n+1;j++)
{
p=p->next;
}printf("%d",p->data);
}
}
int main()
{
int n;
linklist l;
int i;
scanf("%d",&n);
l=creat(&i);
print(l,n,i);
return 0;
}
三、重难点分析
1.寻找倒数第k项,也就是寻找第i-k+1项(总共i项);
2.要注意k越界的情况,可能k<1或k超过了总的项数;
3.在进行线性表构建时,要注意实时统计线性表中数据的个数,如果不是全局变量,要通过“*”引用以进行修改。