链表简介

数组的缺点:

1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N);

2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N);

链表的特点:

由于在链表中插入/删除元素都不需要进行数据的移位, 只需要O(1)时间完成, 因此链表适用于频繁插入与删除的情况;

但是链表也有缺点:链表不适用于需要频繁访问的情况, 因为如果需要查询一个数据, 链表需要遍历整个数据序列, 需要的O(n)的时间, 然而由于数组支持随机访问, 因此数组只需O(1)的时间便可完成数据的访问, 因此此时数组就非常便利了!

单链表

单链表特征如图所示:

单链表只需一个节点(首节点first)来指向该链表,有时为了操作方便,在第一个结点之前虚加一个”头结点”(算法导论称之为”哑节点”),以指向头结点的指针为链表的头指针(为了实现上的方便, 我们采用了这种带有附加头结点的链表实现方案, 同时也为将来我们将该链表改造成循环链表与循环双链表打下了基础)。

由于单链表是一种顺序存取的结构, 因此为找第 i 个数据元素, 必须先找到第 i-1 个数据元素。

单链表节点构造:

class Node
{
private:Type data;  //数据域:节点数据Node *next; //指针域:下一个节点
};

但为了能够应用于MyList<Type>类, 需要对其改造:

//链表节点
template <typename Type>
class Node
{//可以将MyList类作为Node的友元//或者将Node类做成MyList的嵌套类, 嵌套在MyList中, 也可以完成该功能
friend class MyList<Type>;template <typename T>friend ostream &operator<<(ostream &os, const MyList<T> &list);
private://constructor说明://next = NULL;    //因为这是一个新生成的节点, 因此下一个节点为空Node(const Type &dataValue):data(dataValue), next(NULL) {}Type data;  //数据域:节点数据Node *next; //指针域:下一个节点
};

单链表构造:

//链表
template <typename Type>
class MyList
{template <typename T>friend ostream &operator<<(ostream &os, const MyList<T> &list);
public:MyList();~MyList();//将元素插入表头void insertFront(const Type &data);//将元素插入到位置index上(index从1开始)void insert(const Type &data, int index);//删除表中所有值为data的节点void remove(const Type &data);bool isEmpty() const;//链表反转void invort();//将链表(list)链接到本条链表的末尾void concatenate(const MyList<Type> &list);private://指向第一个节点的指针Node<Type> *first;
};
//链表的构造
template <typename Type>
MyList<Type>::MyList()
{//first指向一个空节点first = new Node<Type>(0);first -> next = NULL;
}
//链表的析构
template <typename Type>
MyList<Type>::~MyList()
{Node<Type> *deleteNode = NULL;while (first != NULL){deleteNode = first;first = first -> next;delete deleteNode;}
}

元素插入:

由前面的图像可见,在单链表中插入结点只需要修改指针。但同时,若要在第i个结点之前插入元素,修改的是第i-1 个结点的指针。

因此,在单链表中第 i 个结点要进行的基本工作为:找到线性表中第i-1个结点,然后修改其指向后继的指针。

template <typename Type>
void MyList<Type>::insertFront(const Type &data)
{Node<Type> *newNode = new Node<Type>(data);newNode -> next = first -> next;first -> next = newNode;
}
template <typename Type>
void MyList<Type>::insert(const Type &data, int index)
{//由于我们在表头添加了一个空节点//因此如果链表为空, 或者在链表为1的位置添加元素//其操作与在其他位置添加元素相同int count = 1;//此时searchNode肯定不为NULLNode<Type> *searchNode = first;// 找到要插入的位置// 如果所给index过大(超过了链表的长度)// 则将该元素插入到链表表尾// 原因是 searchNode->next != NULL 这个条件已经不满足了// 已经到达表尾while (count < index && searchNode->next != NULL){++ count;searchNode = searchNode->next;}// 插入链表Node<Type> *newNode = new Node<Type>(data);newNode->next = searchNode->next;searchNode->next = newNode;
}

元素的删除:

在单链表中删除第 i 个结点的基本操作为:找到线性表中第i-1个结点,修改其指向后继的指针。

template <typename Type>
void MyList<Type>::remove(const Type &data)
{if (isEmpty())return ;Node<Type> *previous = first;   //保存要删除节点的前一个节点for (Node<Type> *searchNode = first->next;searchNode != NULL;searchNode = searchNode->next){if (searchNode->data == data){previous->next = searchNode->next;delete searchNode;//重新调整searchNode指针//继续遍历链表查看是否还有相等元素//如果当前searchNode已经到达了最后一个节点//也就是searchNode->next已经等于NULL了, 则下面这条语句不能执行if (previous->next == NULL)break;searchNode = previous->next;}previous = searchNode;}
}
//链表的判空
template <typename Type>
bool MyList<Type>::isEmpty() const
{return first->next == NULL;
}

数据结构基础(8) --单链表的设计与实现(1)之基本操作相关推荐

  1. 数据结构基础(9) --单链表的设计与实现(2)之高级操作

    链表的链接: 将第二条链表的所有内容链接到第一条链表之后, 其完整实现代码与解析如下: //链表的链接 template <typename Type> void MyList<Ty ...

  2. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  3. 数据结构基础(10) --单链表迭代器的设计与实现

    为了向 STL 致敬(O(∩_∩)O~), 我们模仿STL中的list的迭代器, 我们也自己实现一个MyList的迭代器, 以供遍历整个链表的所有元素: 首先:Node节点需要做如下修改(注意后缀有+ ...

  4. c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...

    //在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10 ...

  5. 数据结构精讲——单链表

    新手必会数据结构精讲--单链表 链表的介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 . 实际中链表的结构非常多样,以下情况组合起来就 ...

  6. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  7. 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。

    在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素.例如(7,10,10,21,30,42,42,42,51,70)将变为(7, ...

  8. 数据结构之——《单链表》

    数据结构之--<单链表> 1.链表概念 2.链表分类 3.接口函数实现 1.链表概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现. ...

  9. 头歌平台数据结构与算法 单链表实验 第1关:倒置链表

    任务描述 相关知识 实验目的 实验任务 实验说明 编程要求 测试说明 任务描述 本关任务:请在右侧编辑器的注释行填入适当内容来完成算法,以实现指定的功能,并通过运行来验证. 相关知识 实验目的 理解线 ...

最新文章

  1. 值得收藏的时间复杂度速查表:数据结构操作、排序算法、图操作、堆操作
  2. CodeForces 1131G. Most Dangerous Shark
  3. ehcache rmi_EhCache复制:RMI与JGroups
  4. 阿里Android p6准备,项目经历准备篇——如何准备阿里巴巴P6/P7前端面试
  5. linux中pri=100,浅析Linux中PRI和NI的关系
  6. C#LeetCode刷题之#400-第N个数字(Nth Digit)
  7. 用exists代替distinct
  8. Quartz框架初学1
  9. SQLServer使用表值参数,高性能批量插入数据
  10. 微众银行风险模型笔试前做的准备(公司介绍+欺诈与反欺诈+sql+机器学习)
  11. 华为网络设备与基础配置
  12. 大数元科技牵手中央财经大学 助力财税金融体制改革
  13. Kaldi:提特征报错“compute-fbank-feats: error while loading shared libraries: libkaldi-hmm.so”
  14. opencv 将视频流转换成帧图像(支持asf,mp4,avi)
  15. 玩平衡小车系列—TB6612FNG与直流电机控制教程
  16. C/C++输入未知组数据的方法,多行输入介绍
  17. 老年人智能手机APP开发界面设计因素
  18. 安科瑞电气火灾监控系统对分散在建筑内的探测器进行遥测、遥调、遥控、遥信,方便实现监控与管理。
  19. There were errors checking the update sites: SSLHandshakeException: sun.secu 202007亲测有用
  20. 知乎搜索关键字爬取相关图片

热门文章

  1. 计算机网络之网络概述:4、分层结构(协议、接口、服务)
  2. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
  3. Linux Socket Select说明
  4. openjudge 放苹果 1664
  5. poj2385 基础的动态规划算法 挑战程序设计竞赛
  6. Linux下编译运行Go程序
  7. Glances:一款功能强大的操作系统安全监控平台
  8. Delphi:第一个hello world程序
  9. vue-cli3.0相关的坑
  10. 【原创】大叔问题定位分享(12)Spark保存文本类型文件(text、csv、json等)到hdfs时为什么是压缩格式的...