PTA刷题第十八题
求链式线性表的倒数第K项
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
思路:当数据值大于等于0时,把数据依次读入单链表中,这个过程进行一个计数,可以得到链表的总长度,然后输出第(链表总长度减去K值)个值即可,因为代码注释比较详细,大家看代码就行:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node*next;
}linklist;
int main()
{
int a,n,i,n1,m=0;
linklist *head,*p,*r;
head=(linklist*)malloc(sizeof(linklist));
p=r=head;
while(1){
scanf("%d",&n); //读取序列
if(n>=0) //如序列未结束
{
p=(linklist*)malloc(sizeof(linklist)); //开辟一个结点
p->data=n; //把数据读入p结点
r->next=p; // 新节点插入表尾
r=p; //尾指针指向新表尾
m++; //计数器+1
}
else //到结束就break
{
break;
}
}
r->next=NULL;
p=head->next; //同样头结点里面未存储数据,所以p从头结点下一个结点进行
n1=p->data; //把第一个数即题目中要求的K值读出
if(m-n1>0) //如果计数器值大于K值,则存在倒数第K项
{
for(i=0;i<m-n1;i++)
{
p = p->next; //将p结点向后移动m1-K次,即指向了倒数第K项
}
printf("%d",p->data); //打印倒数第K项
}
else printf("NULL");
}
这里提一下就是如果忽略打印NULL会通不过第二个测试点,所以未通过第二个测试点的可以注意下是否是NULL未打印。