当前位置:网站首页 > 技术博客 > 正文

双向链表的示意图




在这里插入图片描述

上次介绍了不带头单向不循环链表,接下来我们一起看看双向带头循环链表。


双向带头循环链表是一种特殊的双向链表,具有以下特点:

  1. 双向链表: 每个节点有两个指针,一个指向前驱节点(),一个指向后继节点()。因此,从任意节点可以沿链表向前或向后遍历。
  2. 带头节点: 链表中有一个特殊的头节点(通常不存储实际数据,称为哨兵节点)。头节点的主要作用是简化操作,如插入和删除。它提供统一的起始点,使得链表的头尾操作更加方便。
  3. 循环链表: 链表的最后一个节点的 指向头节点,头节点的 指向最后一个节点。因此,链表是循环的,没有明确的开始和结束,方便从任意节点进行循环遍历。
  • 头节点作为链表的起始和终止标记,解决了普通链表操作时需要判断空链表或链表尾部的问题。
  • 空链表时,头节点的 和 都指向自己。
  • 统一操作: 无论链表是否为空,头节点总是存在,插入和删除操作不需要特殊处理空链表或只有一个节点的情况。
  • 双向遍历: 可以从任意节点向前或向后遍历,非常灵活。
  • 循环结构: 链表没有明确的尾部,方便处理循环场景。

双向带头循环链表常用于需要频繁插入和删除操作的场景,能够高效地处理这些操作。
在这里插入图片描述


 
     

双向链表有三个数据,保存它自身数据,他的前驱指针,以及他的后继指针。
在这里插入图片描述


 
      

因为初始化要创造头节点,而且为了方便后续插入操作创造节点,我们要先写出创造节点的方法

创造出的节点本身自己也必须是双向循环的才可以,他的prev以及next都指向他自己,自身成环。
在这里插入图片描述

 
      
 
      
 
       

销毁的时候要遍历链表,将链表中的每一个节点都销毁,这里我们传的是二级指针,头节点会被会被销毁,但后面为了统一接口需要手动释放。

 
       
 
        

和单链表一样,打印链表就是遍历链表.

注意,当时我们的循环条件是pcur != NULL,但是双链表是循环的,还这样写的话就成了死循环,因此需要让循环条件变成 pcur != phead

 
        
 
         

我们来看下面这张图,看一下尾插涉及到了哪些节点。
在这里插入图片描述

 
         
 
          

我们来看下面这张图,看一下头插涉及到了哪些节点。
在这里插入图片描述

 
          
 
           

删除操作要判断当前链表是不是空链表,如果为空就不进行删除。

为空就是链表只有头节点。

 
           

我们来看这张图。
在这里插入图片描述

 
           
 
            

在这里插入图片描述

 
            
 
             

查找遍历链表,返回结点。

 
             
 
              

在这里插入图片描述

 
              
 
               

在这里插入图片描述

 
               

因为有哨兵位的存在,我们不用改变头结点,因此就可以传一级指针

将接口改为一级指针,因为形参无法影响实参,因此需要手动接收所创造出来的结点。

 
                

这样来接收~

 
                

将接口改为一级指针,因为形参无法影响实参,因此创造的plist需要手动释放,将plist放置为NULL。

 
                 

像这样置空~

 
                 

到这里相信大家对双向链表有一个深入的了解了,最后的总结双向链表实现的源码奉上需要的小伙伴们自取哦~

 
                  
 
                  
 
                  

真相永远只有一个!

在这里插入图片描述

  • 上一篇: c++中的typedef关键字
  • 下一篇: contain_of宏
  • 版权声明


    相关文章:

  • c++中的typedef关键字2025-07-12 12:30:04
  • scanf在c语言中如何使用2025-07-12 12:30:04
  • sscom3.3串口使用说明2025-07-12 12:30:04
  • hikaridatasource连接池2025-07-12 12:30:04
  • 软件测试面试宝典2025-07-12 12:30:04
  • contain_of宏2025-07-12 12:30:04
  • jsoncpp rapidjson2025-07-12 12:30:04
  • 运维监控系统有哪些2025-07-12 12:30:04
  • 什么叫指针数组2025-07-12 12:30:04
  • 如何设计一个高并发高可用系统2025-07-12 12:30:04