链表 - Part I

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

 

  • 优点:可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
  • 缺点:链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

 

  • 一般链表中只有一个表头
  • 元素不是顺序存储的,不能随机访问
  • 元素相互依赖,串联而成

 

构造一个链表:

首先创建两个模板类,一个用来创建链表节点对象,另一个用来创建链表:

 1 template <typename Type> class Node {
 2 public:
 3     Type data;
 4     Node<Type> *next;
 5  
 6     Node(const Type &_data) {
 7         data = _data;
 8         next = nullptr;
 9     }
10 };
11  
12 template <typename Type> class LinkedList {
13 private:
14     Node<Type> *head;
15 public:
16     LinkedList() {
17         head = nullptr;
18     }
19     ~LinkedList() {
20         Node<Type> *current_node = head;
21         while (current_node != nullptr) {
22             Node<Type> *delete_node = current_node;
23             current_node = current_node->next;
24             delete delete_node;
25         }
26     }
27 }

接下来给链表类添加如下的函数操作:

 

插入函数 insert(node, index),将node插入到链表中下标为index的位置:

实现方法:

1. 遍历到链表中要插入的位置的前一位。

2. 令待插入结点的 next 指针指向插入位置的当前结点。

3. 令插入位置之前的当前结点的 next 指针指向待插入结点。

 1 bool insert(Node<Type> * node, int index) {
 2         if (head == nullptr) {
 3             if (index != 0) {
 4                 return false;
 5             }
 6             head = node;
 7             return true;
 8         }
 9         if (index == 0) {
10             node -> next = head;
11             head = node;
12             return true;
13         }
14         Node<Type> * current_node = head;
15         int count = 0;
16         while (current_node -> next != nullptr && count < index - 1) {
17             current_node = current_node -> next;
18             count ++;
19         }
20         if (count == index - 1) {
21             node -> next = current_node -> next;
22             current_node -> next = node;
23             return true;
24         }
25         return false;
26     }

遍历函数output(),从头结点开始通过当前结点的指针找到下一节点直至表尾,并输出所有结点的值:

实现方法:

1. 定义一个用于遍历的变量,初始指向头结点。

2. 输出遍历变量所在结点的值,并更新遍历变量为当前结点的下一个结点。

3. 重复操作 2,直到遍历完所有结点。

 1 void output() {
 2         if (head == nullptr) {
 3             return;
 4         }
 5         Node<Type> * current_node = head;
 6         while (current_node != nullptr) {
 7             cout << current_node -> data << " ";
 8             current_node = current_node -> next;
 9         }
10         cout << endl;
11     }

删除函数delete_node(index),删除链表中下标为index的元素:

实现方法:

1. 从表头遍历找到要删除的位置的前一位。

2. 令删除位置前一个结点的next指针指向待删除位置后一个结点。

3. 删除结点。

 1 bool delete_node(int index) {
 2         if (head == nullptr) {
 3             return false;
 4         }
 5         Node<Type> * current_node = head;
 6         int count = 0;
 7         if (index == 0) {
 8             head = head -> next;
 9             delete current_node;
10             return true;
11         }
12         while (current_node -> next != nullptr && count < index - 1) {
13             current_node = current_node -> next;
14             count ++;
15         }
16         if (current_node -> next != nullptr && count == index - 1) {
17             Node<Type> * delete_node = current_node -> next;
18             current_node -> next = delete_node -> next;
19             delete delete_node;
20             return true;
21         }
22         return false;
23     }

翻转函数reverse(),翻转整个链表:

实现方法:

1. 定义一个用于遍历的指针,初始指向头结点后一个结点。

2. 让头结点的 next 指针置空。

3. 从当前遍历指针所指的结点开始遍历链表,将遍历到的结点 next 指针指向头结点。遍历过程中借助另外一个指针保存下一个遍历到的结点。

4. 重复步骤 3 直至表尾,此时新的链表就是原链表反转后的链表。

 1 void reverse() {
 2         if (head == nullptr) {
 3             return;
 4         }
 5         Node<Type> * current_node, * next_node;
 6         current_node = head -> next;
 7         head -> next = nullptr;
 8         while (current_node != nullptr) {
 9             next_node = current_node -> next;
10             current_node -> next = head;
11             head = current_node;
12             current_node = next_node;
13         }
14     }

 

转载于:https://www.cnblogs.com/xudongwei/p/7493092.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

modelsim6.5b安装和仿真bug

(一)由于6.3以下的需要装smart model&#xff0c;因此就选了6.5b的新版本&#xff0c;在安装完了之后需要对modelsim.ini进行修改&#xff1a;1.把 Resolution ns 改成 Resolution ps2.把 PathSeparator / 用&#xff1b;注释掉3.找到Veriuser并改成&#xff08;去掉注释&am…

jer中无html文件,index.html

Remember that “all things are possible to the one whobelieves.” (Mark 9:23)Remember that “what is impossible with men is possiblewith God.” (Luke 18:27)Remember “whenever you stand praying, forgive, if youhave anything against anyone; so that your Fat…

IOS https抓包及10.3.3版本证书不生效问题解决

Charles安装HTTP抓包HTTPS抓包1. Charles安装 官网下载安装Charles:https://www.charlesproxy.com/download/ 2. HTTP抓包 &#xff08;1&#xff09;查看电脑IP地址 &#xff08;2&#xff09;设置手机HTTP代理iphone连上wifi&#xff0c;点击“设置->无线局域网->连接的…

C# 备忘

1.使用partial来修饰类和结构&#xff0c;运行跨多个*.cs文件来定义c#类型。类型名必须是一致的&#xff0c;并且定义在相同的.NET命名空间中。 2.C#提供了关键字sealed来防止发生继承&#xff0c;如果将类标记为sealed&#xff0c;编译器将不会允许我们从这个类型派生。有时不…

计算机网络上网时间,电脑怎么限制上网时间

孩子的学习和娱乐都离不开电脑,很多事情的完成都是需要借助电脑,但其负面影响也逐渐体现下面是学习啦小编为大家整理的关于电脑怎么限制上网时间&#xff0c;一起来看看吧!电脑怎么限制上网时间先登录路由器主页。如果知道家长和孩子电脑的Mac地址的可以直接跳到第四步。很多人…

与protected成员有关的单元测试方式

这是一篇简单的文章&#xff0c;讨论了单元测试中遇到protected成员的应对方案。此外&#xff0c;在文章最后也希望和大家讨论一下某个特殊的情况下的处理方法。 protected是一个有趣而有用的修饰符&#xff0c;它把方法的访问成员严格限制在自身或自己的子类身上。换句话说&am…

计算机画面的音乐素材,音效素材:高科技用户界面UI点触计算机数据分析全息音效合集...

音效素材&#xff1a;高科技用户界面UI点触计算机数据分析全息音效合集包含1000多组模块化用户界面音效&#xff0c;由最好的制造商“EURORACK”亲自录制。MODULAR UI是由世界著名的音响设计师和音乐家理查德迪瓦恩共同创建的一个用户界面音效库。设计并完全由理查德迪瓦恩的个…

cacti安装FAQ

为什么80%的码农都做不了架构师&#xff1f;>>> CACTI中MSN和EMAIL不能同时预警 描述 CACTI中使用thold可以实现邮件的预警&#xff0c;超过阀值的时候&#xff0c;基本上可以在半个小时之内把邮件发出来&#xff0c;这种方式是比较稳定的方式。 另外可以使用MSN…

初中计算机新课标培训心得,新课标学习心得体会

新课标学习心得体会由好范文网的会员投稿精心推荐&#xff0c;小编希望以下6篇范文对你的学习工作能带来参考借鉴作用。第1篇&#xff1a;新课标学习心得体会新课标学习心得体会怎么写&#xff1f;以下是我们给你的范文格式参考。用课余时间我认真学习了中心校下发的小学品德与…

利用原生js做数据管理平台

摘要&#xff1a;数据管理平台在当今社会中运用十分广泛&#xff0c;我们在应用过程中&#xff0c;要对数据进行存储&#xff0c;管理&#xff0c;以及删除查询等操作&#xff0c;而我们在实际设计的时候&#xff0c;大牛们大多用到的是JQuery&#xff0c;而小白对jq理解也较困…

ios 阅览器html5,HTML5测试:iOS 8浏览器Safari提升明显

没错&#xff0c;日前&#xff0c;国外著名手机网站GSMArena就发现iOS 8中的Safari浏览器确实增强了对HTML5的支持。如下图所示&#xff0c;在HTML5test.com的数据库中&#xff0c;新版本Safari得到的分数为440(满分为550)&#xff0c;相比iOS 7中的Safari的412分来说还是有不小…

RAID冗余技术的介绍AND实现

一、RAID技术规范简介 RAID技术主要包含RAID 0&#xff5e;RAID 7等数个规范&#xff0c;它们的侧重点各不相同&#xff0c;常见的规范有如下几种&#xff1a; RAID 0&#xff1a;RAID 0连续以位或字节为单位分割数据&#xff0c;并行读/写于多个磁盘上&#xff0c;因此具有很高…

计算机原理 doc,计算机原理作业.doc

PAGEPAGE 1计算机原理作业单项选择题  1&#xff0e;指令JMP?FAR?PTR?DONE属于     A&#xff0e;段内转移直接寻址   B&#xff0e;段内转移间接寻址   C&#xff0e;段间转移直接寻址   D&#xff0e;段间转移间接寻址2&#xff0e;下列叙述正确的是    …

运行下的命令

oobe/msoobe /a----检查XP是否激活 notepad--------打开记事本 gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 lusrmgr.msc----本机用户和组 services.…