1-6 求链式线性表的倒数第K项(不同的思路 3种方法)

it2024-04-21  7

1-6 求链式线性表的倒数第K项 (20分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。

输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。

输出格式: 输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。

输入样例: 4 1 2 3 4 5 6 7 8 9 0 -1 输出样例: 7 (1)采用头插法存入数据 例如输入 1 2 3 4存进去的是4 3 2 1 找倒第k个 此时就是找正k个

#include<stdio.h> #include<stdlib.h> typedef struct node { int Data; struct node *next; }*LinkList; int main() { LinkList h=NULL,L=NULL; int n; scanf("%d",&n); int x; scanf("%d",&x); int i=0; //头插法 while(x>=0) { L=(LinkList)malloc(sizeof(struct node)); L->Data=x; L->next=h; h=L; i++; scanf("%d",&x); } //如果没有第k个,输出NULL,否则就找到第k 个,并输出 if (i<n) printf("NULL"); else { //注意这i=1,这是我的犯错点, //如果要找第一个即n=1,进入不了循环,就输出此时第一个结点L的data; for(i=1;i<n;i++) { L=L->next; } printf("%d",L->Data); } }

(2)采用尾插法存入数据 一直保持k个结点,则第一个就是要找的倒数第k项 说实话我觉得这个麻烦

#include<stdio.h> #include<stdlib.h> struct node { int data; struct node *next; }; typedef struct node *LinkList; int main() { int k,x,i=0; scanf("%d",&k); LinkList head,p,q; head=(LinkList)malloc(sizeof(struct node)); head->next=NULL; p=head; while(scanf("%d",&x)!=EOF&&x>=0) { q=(LinkList)malloc(sizeof(struct node)); q->data=x; q->next=NULL; p->next=q; p=q; i++; if(i>=k) { head=head->next; } } if (i<k) printf("NULL"); else printf("%d",head->data); }

(3)数组法//看的大佬的

#include<stdio.h> #define max 0xffffff int a[max]; int main() { int i=0,x,k; scanf("%d",&k); while(1) { scanf("%d",&x); if(x<0) break; else { a[i]=x; i++; } } if (i<k) printf("NULL"); else printf("%d",a[i-k]); return 0; }
最新回复(0)