给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
题目转化:
将输入的一串非负整数以尾插法正序放入链表,求这一顺序链表的倒数第K项
<=>将输入的一串非负整数以头插法倒序放入链表,求这一倒序链表的第K项
因此,我们只需实现用头插法将一串非负整数形成一个链表,再遍历找到该链表的正数第K项即可。
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode *Linklist;
typedef struct Lnode
{
int data;
struct Lnode *next;
}List;
int main()
{
Linklist L, k;
List *s;
int flag = 1;
int K, x, i=0, j;
L = (Linklist*)malloc(sizeof(List));
L = NULL;
scanf("%d", &K);
while(flag)
{
scanf("%d", &x);
if(x<0)
flag = 0;
else
{
s = (List *)malloc(sizeof(List));
s->data = x;
if(L == NULL)
{
L = s;
s->next = NULL;
}
else
{
s->next = L;
L = s;
}
i++;
}
}
k = (Linklist*)malloc(sizeof(List));
k = L;
if(i<K)
printf("NULL");
else
{
for(j = 1; j < K; j++)
{
k = k->next;
}
printf("%d", k->data);
}
}