4链表

 

对比数组,链表不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用。
 
 
链表有单链表、双链表、循环链表
     单链表
        将零散的内存块(被称为结点)串联在一起,每个链表的节点除了存储数据外还要存储下一个结点的指针,记录下一个结点的指针成为后继指针。
        头结点和尾结点比较特殊,头结点记录链表的基地址,用它,便可以遍历整个链表,尾结点存储的指针指向一个空地址NULL
        
            
        链表和数组一样支持数据的查找、插入和删除
        看图便可知,链表的单纯的(插入和删除)的时间复杂度为O(1)
        但鱼与熊掌不可兼得,链表的查询就不能像数组一样通过首地址和下标经过寻址公式便可以得到,所以链表的查询只能一个个遍历,时间复杂度为O(n)
        
     循环链表
        尾结点指向头结点的单链表
        当处理的数据具有环形结构时,就适合使用循环链表,如约瑟夫问题。
        
     双向链表
    
        pre前驱结点(存储着上一个结点的地址)和next后继结点
        删除操作
            删除结点中“值等于某个给定值”的结点
                单链表和双链表单纯删除时间复杂度都为O(1),但查找值需要遍历操作,因此整个操作时间复杂度为O(n)
                
            删除给定指针指向的结点
                找到要删除的结点q后,删除需要它的prev结点,双链表因为有了prev指针,时间复杂度为O(1),单链表仍要遍历寻找,为O(n)
                
            指点结点插入,同理,单链表为O(n),双链表O(1)
            
        在有序链表中按值查询,双链表也更有效率,可以几率上次查找的位置p,根据查找的值与p对比,决定查找方向。
        
        双链表的效率--->Java中LinkedHashMap --> 用空间换时间
        
         双向循环链表
        
         链表VS数组
        
 
链表更适合插入、删除操作频繁的场景,查询的时间复杂度较高,具体开发中,需要综合对比链表和数组选择其中一个
 

猜你喜欢

转载自www.cnblogs.com/huangguoming/p/10484871.html