前面写了STL中关于string类和vector类的简单实现,要想成体系学习的小伙伴可以看一看(48条消息) STL中vector类的自我简单实现_芜湖开冲~的博客-CSDN博客https://blog.csdn.net/qq_55143256/article/details/124241928
(76条消息) STL中string类的自己实现_芜湖开冲~的博客-CSDN博客_stl string实现
今天我们继续来简单实现STL中list的简单实现,所谓简单实现,就是没什么技术含量,很简单就能实现,当然,其实好多方法,和官方给的也差不多,基本都是那么回事,稍微学一下就看明白了,虽然底下代码挺多的,但是大部分都是代码复用,真正要理解的,也就是几个点而已.
目录
具体步骤
1.迭代器的简单理解
迭代器,咱们也不搞那些虚的,什么分类,官方定义什么的,咱就搞清楚一点,就是这个玩意是干什么的就够了,干什么的,也很简单,你可以理解为光标,也就是你打字的时候,你打一个字,后面的那个竖道道就会自动往后面动一下,迭代器其实本质就是这个玩意,就是为了方便我们对数组之类的进行遍历的时候用的,我给它++一下,它就跳到下一个元素上面去了,所以,咱们自己给给迭代器下一个定义:迭代器就是方便我们进行对数组元素等进行操作(如++一下,就跳到下一个,方便遍历)的光标.
当然,我们今天讲的是链表,那就是方便对链表元素进行操作的光标,在前面string和vector的操作中,因为它两的底层空间都是连续的,所以就直接用原生态的指针就行了,我想访问下一个元素,直接对指针进行++不就行了么,今天的链表由于底层空间不连续,所以我们对指向某一元素的地址直接进行++,谁知道搞出来的是什么妖魔鬼怪,所以我们需要一点点的改进.
2.链表结构的简单理解
对链表有了解的可以直接往下翻,这个就是简单的解释一下链表,如图所示,链表的本质就是这个玩意,中间的val存放具体的动西,比如说我存放一个数字,一个字符,甚至一个数组,一个程序什么的都行,然后next是一个指针,指向下一个这个小玩意,比如说我这个里面放一个lol程序,下一个里面放一个吃鸡程序,我玩完lol,想玩吃鸡,我只需要通过next指针指向的地址,就可以知道吃鸡在哪里了,(什么,你说我吃鸡在桌面上?那你前年随手接收的一个文件在哪你知道么?如果有一个链表,把你所有接收的文件都串起来,那你想找某个日期以后的,只要一直顺着next找就行了,以前的,那自然就是prev了)嗯,前后的next和prev就是负责找它前面节点和后面节点的,好多节点串一串,就构成了链表.
3.设置自己的命名空间
为什么要设置自己的命名空间呢,很简单,人家自己有list类,那我们要想玩,就得关起门,我们自己造我们自己的,不和他们一起玩,当然,你也可以不叫list,也行,那没有和人家同名,就不需要这一步了,我的建议是加上,一方面显得专业,另一方面美观,编程也是一门艺术嘛,是吧,之后的代码都在命名空间里面.
我制造的命名空间(是不是很简单)
namespace czz{}
4.设置类
这一步很关键,也是最难的一步,可能也是唯一难的一步,就是你要想明白这三个类的联系,不然后面他们真的联系起来了你就一脸目瞪狗呆了
定义节点类
所谓的节点类,就是为我们前面那个描述链表的图形给制造出来,就是把那两个指针和一个val包装在一个结构体,准确的说叫做类里面(当然,用的是模板,鬼知道你要往val里面填什么玩意)
template<class T>
struct ListNode
{
ListNode(const T& val = T()) //构造函数
:_val(val)
,_pPre(nullptr)
,_pNext(nullptr)
{}
ListNode<T>* _pPre;
ListNode<T>* _pNext;
T _val;
};
如果不知道什么是类的小伙伴可以去学一下,也不难,不知道什么是模板的小伙伴可以看一下这个博客,写的又简单又精彩(狗头)