单链表与双链表

Posted on 2022-02-22 17:32  ZheyuHarry  阅读(55)  评论(0编辑  收藏  举报

 //请注意,从这里开始讲的数据结构更多的是为了理解算法而存在的,可能讲的不是很完整

      链表是一种比较特殊的数据结构,就像一条锁链一样链接起来。

      通常,我们会把链表用一个结构体+指针的方式来存储数据,

      new的底层涉及内存分配,调用构造函数,指针转换等多种复杂且费时的操作。一秒大概能new1w次左右。

 

      在平时的工程代码中,不会涉及上万次的new操作,所以这种结构是一种 见代码知意 的好结构。

 

      但是在算法比赛中,经常碰到操作在10w级别的链表操作,如果使用结构体这种操作,是无法在算法规定时间完成的。

 

      所以,在算法比赛这种有严格的时间要求的环境中,不能频繁使用new操作。也就不能使用结构体来实现数组。

 

 

      先大概简介一下单链表的应用,我们单链表中用到最多的是邻接表,主要是用来存储树和图;

双链表则是用来优化某些问题的;

 

      然后我们具体来说说看,对于单链表用数组模拟的一些操作是怎么实现的:

例题:826. 单链表 - AcWing题库

      题解:

        我们首先要链表的tail指向的空,我们这里理解为-1,所以我们一开始设置的head要初始化为-1,用idx来表示到现在为止已经插入了多少数;

 

        因为这道题目,要进行的操作是对第k个插入的元素,所以我们要去找到这个第k个插入的元素,所以我们用idx来作为索引;这样保证了我们只有在有插入操作时,才会idx++,这也就保证了我们的idx所指向的一定是第k个被插入的元素。

 

       对于Headinsert或者单纯的insert我们其实套路都是将被插入元素的下一个指针指向第k个元素所指向的指针,然后第k个元素的指针指向被插入的元素;

 

       对于删除的操作,我们先判断是删除头节点(特判),还是其他结点,如果是删除一般节点,我们这里需要传入的参数是k-1(因为我们的idx是从0开始的);

      然后就是在输出ans的时候需要注意判断的边界条件是什么;

图解:

 

这就是单链表的一些基本操作!