zoukankan      html  css  js  c++  java
  • 数据结构-链表

    数组需要一块连续的内存用来存储数据,而链表恰恰相反,它并不需要一块连续的内存,它通过指针将不连续的内存块串起来。

    链表结构很多,我们说下最常见的,单链表,双向链表和循环链表。

    我们先看比较简单的单链表

     

    如上图可以看出来,图中的每个节点不仅需要存储数据,还需要记录一个指向下一个节点的指针,如图所示,我们把记录下一个节点的指针叫做后继指针 next

    图中有两个节点比较特殊第一个节点我们叫做头节点,最后一个节点我们叫做尾结点,头节点记录了这个链表的基地址,尾节点的指针不是指向一个节点,而是指向一个空地址NULL。

    我们知道在数组的插入和删除操作后,为了保持连续内存的特点需要搬移大量数据,而在链表中我们不需要保持连续内存的结构,所有我们在链表中插入和删除操作时时间要比在数组中操作删除添加速度快,

    针对链表的插入和删除操作可以看下图

    但是有利就有弊,在链表中查询数据的时候就没有数组那么快了,在数组中可以首地址和下标可以很快查出来,因为是连续的,但是在链表中由于不是连续的,我们就需要根据指针节点一个一个遍历才能查询出需要的数据。

    接下来我们看下循环链表,其实循环链表就是一种特殊的单链表

    循环链表就是尾结点指向链表的头节点,而不是指向一个空值,有点就是从链表尾部查询到链表头部很方便,在处理某些特殊的数据结构时很有用处。

    最后我们在看下双向链表

    单链表只有一个方向,只有一个后继指针next指向下一个节点,而双向链表有两个指针,它还有一个前驱指针,顾名思义,就是指向前一个节点的指针。

    从图中可以看出,双向链表需要存储额为一个指针,所以在存储相同数据的情况下,双向链表要比单链表占用更多的内存空间,虽然两个指针比较浪费存储空间,但是可以支持双向遍历,带来了更多的灵活性。

    链表VS数组性能大比拼

     

    数组简单易用,在实现上用连续的内存,在查询的时候cpu可以通过预读缓存提高查询效率,而链表由于不是连续的所以对cpu缓存不友好。

    数组确定是由于内存连续,所以当空间不够时,需要再去申请一块内存,然后在搬移数据,很费事,而链表大小没有限制,天然的支持动态扩容,这个是和数组最大的区别。

    这两种数据结构各有优劣,在实际开发中需要根据实际情况去选择。

  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/sjks/p/10931114.html
Copyright © 2011-2022 走看看