zoukankan      html  css  js  c++  java
  • 第二节:线性表→顺序表→链表 逐个击破

    一. 线性表

    1. 前言

      线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即 “ 把所有(一对一逻辑关系的)数据用一根线儿起来,再存储到物理空间中 ”。这根线有两种串联形式,如下图,即顺序存储(集中存放)和链式存储(分散存放)。

       图 3a) 是多数人想到的存储方式,而图 3b) 却少有人想到。我们知道,数据存储的成功与否,取决于是否能将数据完整地复原成它本来的样子。如果把图 3a) 和图 3b) 线的一头扯起,你会发现数据的位置依旧没有发生改变。因此可以认定,这两种存储方式都是正确的。

    引出线性表的定义:

      将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构(简称线性表)。

    PS:使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致,也就是说,线性表存储的数据,要么全不都是整形,要么全部都是字符串。一半是整形,另一半是字符串的一组数据无法使用线性表存储。

    2. 顺序结构和链式结构

    线性表存储数据可细分为以下 2 种:

      如图 3a) 所示,将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构(简称顺序表);

      如图 3b) 所示,数据分散的存储在物理空间中,通过一根线保存着它们之间的逻辑关系,这种存储结构称为链式存储结构(简称链表);

    也就是说,线性表存储结构可细分为顺序存储结构和链式存储结构。

    3. 前驱和后继

      数据结构中,一组数据中的每个个体被称为“数据元素”(简称“元素”)。对于具有“一对一”逻辑关系的数据,我们一直在用“某一元素的左侧(前边)或右侧(后边)”这样不专业的词,其实线性表中有更准确的术语:

    • 某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
    • 某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;

    以图 1 数据中的元素 3 来说,它的直接前驱是 2 ,此元素的前驱元素有 2 个,分别是 1 和 2;同理,此元素的直接后继是 4 ,后继元素也有 2 个,分别是 4 和 5。如图下图所示:

    二. 顺序表

    1. 简介

      顺序表,全名"顺序存储结构",是线性表的一种。我们知道线性表是用来存储逻辑关系为 "一对一" 的数据,顺表也不例外。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙

      例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如下图:

      由此我们可以得出,将“具有 '一对一' 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。

       顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组

     

    三. 链表

    1. 简介

      链表,别名链式存储结构 或 单链表,也是线性表的一种,用于存储逻辑关系为 "一对一"的数据。顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。

      例如,用链表存储 {1,2,3},数据的物理存储空间如下:

      

       上图根本无法体现出各数据之间的逻辑关系,对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素。如下图:

       

       由此我们得出:数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构

    2. 链表的节点

      链表中每个数据的存储都由以下两部分组成:

      (1). 数据元素本身,其所在的区域称为 数据域

      (2). 指向直接后继元素的指针,其所在的区域称为 指针域; 如下图所示:

       链表实际存储的是一个一个节点,真正的数据元素包含在这些节点中,如下图所示:

     

    3. 头节点、头指针和首元节点

      一个完整的链表需要由以下几部分构成:

      (1). 头指针:一个普通的指针,它的特点是永远指向链表第一个节点的位置。很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;

      (2). 节点:链表中的节点又细分为头节点、首元节点和其他节点:

        A. 头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;

        B. 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;

        C. 其他节点:链表中其他的节点;

      因此,一个存储 {1,2,3} 的完整链表结构为:

     

       注:链表中有头节点时,头指针指向头节点;反之,若链表中没有头节点,则头指针指向首元节点。

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    二进制位运算
    Leetcode 373. Find K Pairs with Smallest Sums
    priority_queue的用法
    Leetcode 110. Balanced Binary Tree
    Leetcode 104. Maximum Depth of Binary Tree
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 64. Minimum Path Sum
    Leetcode 63. Unique Paths II
    经典的递归练习
    案例:java中的基本排序
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/12567230.html
Copyright © 2011-2022 走看看