/*
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第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 List
{
int data; // 结点数据
int pos; //当前结点在链表中的位置
struct List *next; // 指向下一个结点的指针
}List, *pList;
// 创建链表
pList input(pList L)
{
int ch, count = 0;
pList p = L; // 初始化指针p用于指示链尾
pList new; // 新结点定义
scanf("%d", &ch);
while (ch >= 0)
{
count++;
new = (pList)malloc(sizeof(List));
if (p == NULL) // 如果头结点还没有传值
{
L = new;
}
else // 新结点链接到链表尾部情况
{
p->next = new;
}
new->data = ch; // 结点传值
new->pos = count; // 记录结点位置
new->next = NULL; // 新结点指针域置为空
p = new; // p继续指向新的链尾
scanf("%d", &ch); // 输入新的结点值
}
return L;
}
void search(pList L, int K)
{
pList p = L, q = L;
int count = 0; // 记录链表长度
while (p) // 遍历链表,获取链表长度
{
p = p->next;
count++;
}
if (L != NULL && count >= K) // 合法处理情况
{
while (q)
{
if (q->pos == count - K + 1) // 通过将倒序位置转换为顺序位置,再与链表中的结点位置信息比较是否一致,从而获取所需结点的值
{
printf("%d\n", q->data);
break;
}
q = q->next;
}
}
else // 不合法情况
{
printf("NULL\n");
}
}
void main()
{
int K;
pList L = NULL;
pList L1 = NULL;
scanf("%d", &K);
L1 = input(L);
search(L1, K);
//system("pause");
}
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字
最新推荐文章于 2023-10-17 16:11:38 发布