2-2 求链式线性表的倒数第K项
分数 5
作者 DS课程组
单位 浙江大学
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:
1
| 4 1 2 3 4 5 6 7 8 9 0 -1
|
输出样例:
第三次遇到这个题了
答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <iostream> using namespace std;
typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList;
void initList(LinkList &L) { L = new LNode; L->next = NULL; }
void insertAtTail(LinkList &tail, int num) { LNode *newNode = new LNode; newNode->data = num; newNode->next = NULL; tail->next = newNode; tail = newNode; }
int getK(LinkList L, int K) { LinkList fast = L->next; LinkList slow = L->next; for (int i = 0; i < K; i++) { if (fast == NULL) { return -1; } fast = fast->next; } while (fast != NULL) { fast = fast->next; slow = slow->next; } return slow->data; }
int main() { LinkList L; initList(L); int K, num; cin >> K;
LinkList tail = L; while (cin >> num) { if (num < 0) { break; } insertAtTail(tail, num); } int x = getK(L, K); if (x < 0) { cout << "NULL"; } else { cout << x; } }
|
同样还是要注意K是否大于链表长度