数据结构--线性链式表倒数第K项
来源:互联网 发布:ubuntu源无法更新 编辑:程序博客网 时间:2024/06/05 07:08
https://pintia.cn/problem-sets/910354764736491520/problems/910354975319912451(点击打开链接)
题目大意:给你一系列数,求倒数第k个数。
分析:一道思路题吧,虽然简单的数组就可以做,但学的毕竟是数据结构,还得用数组来做,一开始用的双向链表,写不出来,后来改成单向链表,卡在大数据上了。后来同学让帮忙找bug,看了人家的代码,用的是单向链表逆序创建,倒数第k个就成了正数第k个,不得不佩服啊!!!
代码:
#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cstdio>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define INFEASIBLE -1#define OVERFLOW -2#define ll long longusing namespace std;typedef int Status;typedef ll ElemType;//随机大数据,改成ll才能过typedef struct LNode{ ElemType data; int length; struct LNode *next;} LNode,*LinkList;Status Creat_L(LinkList &L);Status Print_L(LinkList &L,int k,ElemType &e);int main(){ LinkList L; L = (LNode*)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); int k; scanf("%d",&k); Creat_L(L); ElemType res; Print_L(L,k,res); if(!res) cout << "NULL" << endl; else cout << res << endl;}Status Creat_L(LinkList &L){ LNode *curPtr,*rearPtr; rearPtr = L; L -> length = 0; while(1) { curPtr = (LNode*)malloc(sizeof(LNode)); if(!curPtr) exit(OVERFLOW); //原先用的int类型的,后来改成ll,但是这里忘改了,结果wa了一晚上。。。。。。 scanf("%lld",&curPtr -> data); if((curPtr -> data) < 0) { rearPtr -> next = NULL; return OK; } else { curPtr -> next = NULL; rearPtr -> next = curPtr; rearPtr = curPtr; L -> length++; } }}Status Print_L(LinkList &L,int k,ElemType &e){ if(k <= 0 || k > L -> length) return ERROR; int ans = 1; LNode *curPtr; curPtr = L -> next; while(ans < L -> length - k + 1) { curPtr = curPtr -> next; ans++; } e = curPtr -> data; return OK;}
- 用的单链表,输出倒数第k个,也就是输出正数第length - k + 1个,思路还不是自己想出来的。。。。。
和上面的思路差不多,但是这个给人一种更高大上的感觉,链表逆序创建。
代码:
#include<stdio.h>#include<malloc.h>#include<stdlib.h>//函数状态码定义#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next; int length;} LNode,*LinkList;Status Creat_L(LinkList &L);Status Print_L(LinkList &L,int k);int main(){ LinkList L; int k; scanf("%d",&k); Creat_L(L); Print_L(L,k);}Status Creat_L(LinkList &L){ L = (LNode*)malloc(sizeof (LNode)); if(!L) exit(OVERFLOW); LNode *curPtr,*rearPtr; rearPtr = L; L -> next = NULL; L -> length = 0; int m; while(scanf("%d",&m) && m >= 0) { curPtr = (LNode*)malloc(sizeof (LNode)); if(!curPtr) exit(OVERFLOW); //链表逆序创建 curPtr -> data = m; curPtr -> next = L -> next; L -> next = curPtr; L -> length++; } return OK;}Status Print_L(LinkList &L,int k){ if(k <= 0 || k > L -> length) { printf("NULL\n"); return ERROR; } else { LNode *curPtr; curPtr = L -> next; int ans = 1; while(ans < k) { curPtr = curPtr -> next; ans++; } printf("%d\n",curPtr -> data); return OK; }}
真的有必要和别人的代码进行比对啊!!!
双向链表也搞定了,嗯,真的要静下心来才可以,不然效率会更低的!!!!
代码:
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>#define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2using namespace std;typedef int Status;typedef int ElemType;typedef struct LNode{ ElemType data; int length; struct LNode *prior,*next;}LNode,*LinkList;Status Creat_L(LinkList &L);Status Print_L(LinkList &L,int k);int main(){ LinkList L; L = (LNode*)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); int k; scanf("%d",&k); L -> next = NULL; L -> prior = NULL; Creat_L(L); Print_L(L,k);}Status Creat_L(LinkList &L){ LNode *curPtr,*rearPtr; rearPtr = L; L -> length = 0; int m; while(scanf("%d",&m) && m >= 0) { curPtr = (LNode*)malloc(sizeof(LNode)); if(!curPtr) exit(OVERFLOW); curPtr -> data = m; curPtr -> prior = rearPtr; curPtr -> next = NULL; rearPtr -> next = curPtr; rearPtr = curPtr; L -> length++; } rearPtr -> next = L; L -> prior = rearPtr; return OK;}Status Print_L(LinkList &L,int k){ if(k <= 0 || k > L -> length) { printf("NULL\n"); return OK; } int ans = 1; LNode *curPtr; curPtr = L -> prior; while(ans < k) { curPtr = curPtr -> prior; ans++; } printf("%d\n",curPtr -> data); return OK;}
阅读全文
1 0
- 数据结构--线性链式表倒数第K项
- 《数据结构学习与实验指导》3-5:求链式线性表的倒数第K项
- 求链式线性表的倒数第K项
- 求链式线性表的倒数第K项
- 求链式线性表的倒数第K项
- 求链式线性表的倒数第K项
- 《数据结构学习与实验指导》3-5求链式线性表的倒数第K项/3-6表达式转换
- PAT 3-05. 求链式线性表的倒数第K项
- 浙大PAT 3-05. 求链式线性表的倒数第K项 (解题思路)
- PAT DS 3-05求链式线性表的倒数第K项
- PAT 3-05 求链式线性表的倒数第K项(C语言实现)
- PAT1021. 求链式线性表的倒数第K项(15)
- pat 3-05. 求链式线性表的倒数第K项(水题)
- 5-19 求链式线性表的倒数第K项 (20分)
- 5-19 求链式线性表的倒数第K项 (20分)
- 5-19 求链式线性表的倒数第K项 (20分)
- 5-19 求链式线性表的倒数第K项 (20分)
- PTA5-19 求链式线性表的倒数第K项
- 连续数值属性的CART decision tree
- spring+websocket整合(springMVC+spring+MyBatis即SSM框架和websocket技术的整合)
- Spring Boot整合Quartz实现定时任务表配置
- centos增加yum源方法
- Leetcode之Missing Number 问题
- 数据结构--线性链式表倒数第K项
- dubbo 配置文件详解
- 解决window 热键(快捷键)占用问题
- 线程池编程示例
- iOS之Xcode 9 快捷键查看类或方法声明定义
- Java设计模式_(结构型)_组合模式
- Android greendao将数据库存在SD卡
- Java 自带四种线程池的使用
- unity新版粒子特效的组件获取