7-17 求链式线性表的倒数第K项 (20 分)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL
。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
法一:用数组:
#include<stdio.h>
#define N 1000005
int main()
{
int a[N],size=0,temp;
int k;
scanf("%d",&k);
while(1)
{
scanf("%d",&temp);
if(temp<0)
{
break;
}
a[size++]=temp;
}
if(k<=size)
{
printf("%d",a[size-k]);
}
else
{
printf("NULL");
}
}
注意N的取值 得取到1000005 如果整1000000会有一个错误
优点:简洁,易懂,较容易想出 ,能快速编出
缺点:太暴力,无论如何总要申请那么大的连续空间,并且还要记得申请一百万零5的空间,申请100万都不行
法二:用链表:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node *LNode;
struct Node
{
int data;
LNode Next;
};
int main()
{
int cnt=0,n,d;
LNode head=(LNode)malloc(sizeof(struct Node));
LNode p,q,t;
if(!head) return 1;
head->Next=NULL;
scanf("%d",&n);
p=q=head;
while(scanf("%d",&d)!=EOF&&d>=0)
{
p=(LNode)malloc(sizeof(struct Node));
if(!p) return 1;
p->data=d;
p->Next=NULL;
q->Next=p;
q=p;
cnt++;
if(cnt>=n)
{
t=head;
head=head->Next;
free(t);
}
}
if(cnt>=n) printf("%d",head->data);
else printf("NULL");
}
优点:该方法所占空间少,而且占的空间是不连续的,没给系统造成压力,很巧妙。
缺点:这个算法较不容易想出,较复杂
该题注意一个问题:题目所说的输入格式与范围与实际拼题给的格式和范围不符。
输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
题目所说之后是若干正整数,0不是正整数,但给的样例里面有0 所以判断条件一定要写d>=0 而不是d>0 若是后者 将会漏掉一个0值