zoukankan      html  css  js  c++  java
  • 算法复习(4)向量与列表

      向量是由一组元素封装而成的线性序列。向量是数组的抽象与泛化,元素类型可以灵活选取。向量使用连续的内存存储元素。一旦容量需要扩充,在紧临的后方再开辟一块内存(通常是倍增)。如果后方的内存不足,则寻找一块足够大的内存,开辟倍增的内存,再将原来的向量复制过来。

      向量是连续内存,所以循秩访问非常方便,通过指针计算,可以一步到位。同时,也由于必须是连续内存,在其中插入与删除元素,需要对后续的元素全部进行移动,操作复杂。

      列表采用动态储存策略。其中的元素称为节点。每个节点至少包含三个成员,数据、前指针和后指针。各节点通过指针相互联接,在逻辑上是一个线性结构。

      与向量中紧密的内存排布不同,列表的内存可以是不连续的,通过指针串在一起。通过操作符重载,列表也可以实现“循秩访问”,但实质上是逐次移动到秩代表的节点。列表可以方便的插入与删除。插入删除只用修改3个元素的指针指向即可,对其他元素无影响,效率较高。

      删除列表中元素的过程如下:

      先将元素的前后节点连接起来(p -> pred -> succ = p -> succ; p -> succ -> pred = p -> pred;)

      再delete p。

      向列表中插入元素的过程如下:

      新建节点,新建的过程中,将新节点是的指针正确指向。(node -> succ = p; node -> pred = p -> pred;)

      再将原节点及其前节点指针正确指向(p -> pred -> succ = node; p -> pred = node;)

      此处如果引入头尾不可见的哨兵节点,则代码通用。如果不引用,则需要对首末节点的情况单独处理。

  • 相关阅读:
    面试问题之C++语言:C++中指针和引用的区别
    手撕代码:最长回文子串
    手撕代码:求字符串最长回文子序列
    手撕代码:用宏来实现获取数组的大小
    手撕代码之线程:thread类简单使用
    面试问题之计算机网络:OSI七层网络模型及相关协议
    C++各种输入
    C printf格式化输出
    记一次mac 安装MySQL-python 的惨痛经历
    记一次tomcat程序运行慢的处理过程
  • 原文地址:https://www.cnblogs.com/itit/p/3440748.html
Copyright © 2011-2022 走看看