从0到1实现链表v1.0

文章目录

  • 从0到1实现链表v1.0
    • 0、CSDN Markdown目录使用须知
    • 1、版本概览
    • 2、待扩展,更新,优化的部分
    • 3、参考致谢
    • 4、源代码

0、CSDN Markdown目录使用须知

  • 如果你点击了目录↑跳转到一个不做所谓的页面,而导致看不到目录了,请点击浏览器的返回上一页,吐槽CSDN的markdown支持*2
  • 三月份的时候还挺不好用的,但是六月份就好了,奇奇怪怪。
  • 我还想给我的markdown每一个章节末尾插入一个跳转至目录的按钮,不知道怎么加。当然咯,你也可以使用home键返回文章开头,就可以返回目录了。

1、版本概览

  • 这是一个单向链表,带头尾指针;
  • 目前实现的成员函数比较少:构造,获取节点个数,判空,尾插,尾删,链表逆转,输出链表;

2、待扩展,更新,优化的部分

  • 还需增加:清零,析构,指定位置增、删,排序(话说适合链表的排序算法有几种啊?),查找(极其愚笨的低效查找,链表是否有序都不影响它的低效性);
  • 还需优化:
    • 写成类模板,以此获得更好的复用;
    • 整体重写成双向链表,实现的尾删那一个成员函数,可以由O(n)变成O(1),巨大的时间复杂度的提升;
    • 把每个函数拆分cpp编写,会变得更容易查看;
    • 话说,如果写成了类模板,又做了cpp的拆分,似乎要全部写成hpp,否则在 类模板的 二次编译的 问题上 会出错;

3、参考致谢

  • 这么粗糙的版本参考谁,都算得上是对原作者的侮辱
  • 本人(陈澈)纯手打,练手

4、源代码

#include<iostream>
using namespace std;//节点结构体
struct Node {int data;Node* next;
};//带头尾指针的单链表,缺点:查找上一项困难,删除尾节点困难
class List {
private:Node* head;Node* tail;int size;
public:List();//~List();int getsize() { return size; }bool isEmpty();void insertLast(int elemnt);int popLast();//及其低效int reverse();void show();
};//构造
List::List() {head = NULL;tail = NULL;size = 0;
}//List::~List() {//怎么样析构掉这个链表呢?,先实现insert再说吧//把insert里面new的那些玩意儿都给delete掉
//}//判空
bool List::isEmpty() {return head == NULL;
}//尾插
void List::insertLast(int elemnt) {Node* node = new Node;node->data = elemnt;node->next = NULL;if (this->isEmpty()) {//当node以第一个元素插入的时候//等效写法:this->isEmpty()  <==>  NULL == tailhead = node;tail = node;}else {//当node以非第一个元素插入的时候Node* temp = tail;tail = node;temp->next = node;}size++;
}//尾删。极其低效O(n),强烈建议用少量空间换取时间,加上一个指针域,变成双向链表
int List::popLast() {//原本一个节点都没有if (this->isEmpty())return -1;//删除失败,已经没节点了//如果只有一个节点了else if (NULL == head->next) {Node* temp = tail;head = NULL;tail = NULL;delete temp;return 0;}//否则,有一个以及以上的节点else {//靠,单向链表删除最后一个节点,尾指针怎么样指向倒数第二额个指针,是个问题呀//不用想了,从头开始遍历,至结尾,低效,所以最好还是写成双向链表//如果poplast是一个高频操作,重构整个链表势在必行Node* last = tail;Node* temp = head, *tempnext = head->next;while (true) {if (tempnext->next == NULL)break;//此刻的temp就是倒数第二个节点temp = tempnext;tempnext = tempnext->next;}tail = temp;temp->next = NULL;delete last;return 0;}
}//逆转链表
int List::reverse() {//当没有节点的情况if (isEmpty())return 0;//有一个节点的情况Node* p1 = head;if (NULL == p1->next)return 0;//当有两个节点或者以上的情况Node* p2 = p1->next;Node* p3 = p2->next;p1->next = NULL;tail = p1;//这一句差点漏了,一个容易修补的小bug,20190316while (true) {p2->next = p1;if (NULL == p3) {head = p2;break;}p1 = p2; p2 = p3; p3 = p3->next;}return 0;
}//打印链表
void List::show() {Node* temp = head;if (this->isEmpty()) {cout << "链表为空" << endl;return;}while (true) {if (temp->next == NULL) {cout << temp->data << ' ' << "链表结束" << endl;break;}cout << temp->data << ' ';temp = temp->next;}cout << "head=" << head->data << ' '<< "tail=" << tail->data << endl;return;
}//这是一个测试函数
void test1() {List li;cout << li.getsize() << endl;li.insertLast(1);li.insertLast(2);li.insertLast(3);li.insertLast(4);cout << li.getsize() << endl;li.show();li.reverse();li.show();
}int main()
{test1();system("pause");return 0;
}

算法001-C++从0到1实现链表v1相关推荐

  1. 点云配准2:icp算法在PCL1.10.0上的实现+源码解析

    目录 本文最后实现的配准实例 点云配准系列 准备 程序结构 主程序 1.为什么要降采样 2.体素降采样原理 3.点云更新 icp 配准前的参数设置 icp配准算法内部 对应点对确定(determine ...

  2. 贝叶斯网络结构学习之K2算法(基于FullBNT-1.0.4的MATLAB实现)

    题目:贝叶斯网络结构学习之K2算法(基于FullBNT-1.0.4的MATLAB实现) 有关贝叶斯网络结构学习的一基本概念可以参考:贝叶斯网络结构学习方法简介 有关函数输入输出参数的解释可以参考:贝叶 ...

  3. acm-LCY算法入门培训-第0讲

    LCY算法入门培训-第0讲 0. 顺带讲的知识 1. 介绍acm 2. 输入 2.1 第一类:输入时不说明有几个Input Block,以EOF未结束标志 2.2 第二类:说明了做几组 2.3 第三类 ...

  4. 蓝桥杯算法竞赛系列第0章——蓝桥必考点及标准模板库STL(上)(万字博文,建议抱走)

    欢迎来到:遇见蓝桥遇见你,不负代码不负卿! 目录 ​ 一.蓝桥必考点剖析 二.什么是STL 三.vector的常见用法详解 1.vector的定义 2.vector容器内元素的访问 (1).通过下标访 ...

  5. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  6. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  7. CDMA 1X WAP2.0业务网 设备实施规范 (V1.0)

    CDMA 1X WAP2.0业务网 设备实施规范 (V1.0) 前 言: 近10年以来,移动通信(包括数据和语音)和Internet几乎成为了在全世界范围内发展最快,最具活力的两项技术.而Intern ...

  8. 2010年北京理工大学中国象棋棋软比赛的冠军引擎新旋风三代升级到Tornado v1.0.4.0, 加密采用Safengine Licensor v1.8.4

    棋软大赛之前新旋风三代的最新版本. Tornado v1.0.3.4, 加密采用Safengine Licensor v1.8.2 棋软大赛之后的新旋风三代的当前版本(截止Nov. 15, 2010) ...

  9. 【PTA】数据结构与算法->6-13 LinkList10-带头结点的单链表逆置【有题解视频,可本地编译器调试】作者 通信DS课程组单位 成都信息工程大学

    题目要求:设计算法Reverse( ),将带头结点的单链表A逆置,要求利用原有链表的链点,最后输出原单链表和逆置后的单链表. 带头结点的单链表结点定义如下: typedef int DataType; ...

最新文章

  1. php 自定义属性,HTML5的data-*自定义属性是什么-
  2. WPF DataGrid横向显示
  3. 每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
  4. 一个Linux下C线程池的实现(转)
  5. shiro学习(21):动态添加验证规则1
  6. ubuntu18.04安装python3_在 Ubuntu 18.04 上安装 Python 3.7
  7. URAL 1404. Easy to Hack! (模拟)
  8. Java内部类的使用小结
  9. java输入某年某个季度_Java获取某年某季度的第一天出错
  10. 搭建Vue2.0脚手架(vue-cli)
  11. hadoop的安装需要java_Hadoop windows本地环境安装
  12. Red5边源服务器集群部署
  13. (数据库篇) SQL查询~ 存在一个表而不在另一个表中的数据
  14. c语言编程软件支持win8,C语言编程软件vc6.0(支持win7 / win8 / 10)官方免费版6.0
  15. 你们要的Echart系列,今天它来了,教你一招快速上手echarts的属性设置,手把手教程系列
  16. LSUN数据集读取和解压,mdb格式转换为jpg格式(保姆教程)
  17. win10刚安装linux黑屏,win10 + Ubuntu18.04 双系统,UEFI+GPT,从win10切换到Ubuntu时黑屏问题...
  18. Selenium键鼠事件_Sinno_Song_新浪博客
  19. 车间生产管理(一)· 产线流程控制及产品质量追溯解决方案
  20. 程序猿,你的安全感呢?

热门文章

  1. 中科院计算所培训中心四季度课程安排
  2. c++知识点总结--结构体
  3. Python课程第十一天_下午_课程笔记(包和模块)
  4. 向日葵连接linux无桌面,远程桌面连接不上怎么解决?向日葵远程桌面控制怎么使用?...
  5. C# 体检套餐管理系统
  6. 清除linux挖矿木马[crypto]的过程
  7. 依赖树(dependecyTree)-语义边、两个词语之间的依赖边路径
  8. 伽利略红十字来信谭之一:哈勃红歌红限红移谭
  9. 电脑图片删除怎么找回?快试试这个方法!
  10. pgsql——查询常用