【练内功,促成长】算法学习(一)数据结构记录

  • 数组

    • 数组占用的内存中连续的空间。
    • JAVA中的ArrayList这种数组,会在数组空间占满后,自动扩容,
      • 扩容方案,就是申请一份更大的内容(应该是1.5倍大), 然后将原数组中的内容复制过去
      • 所以数组的插入操作,一般的时间复杂度是O(1), 最后需要扩容时是O(n), 因为只有极端情况下才会变成O(n), 摊还复杂度是O(1)
    • 如何找到数组中节点在内存中的位置
      • 首节点的内存地址 + 数组下标 * 节点size
      • 这也是为什么数组从0开始,因为可以减少一次 下标 - 1 的操作
  • 链表

    • 链表可以使用内存中不连续的内存空间
    • 一般的链表是由一个链表本身的内容加上一个next的指针(指向下一个节点的内存地址)构成
    • 双向链表,就是普通的链表内容中附加一个prev指针(指向该节点的上一个节点)
    • 循环单向链表,单向链表的最后一个节点的next指针指向第一个元素(head)
    • 循环双向列表, 就是链表的最后一个节点的next指针指向第一个元素(head), 链表的第一个节点的prev指针,指向最后一个元素;
    • 链表可以使用不连续的内存空间,所以链表的插入操作,时间复杂度都是O(1)。
    • 链表的算法练习题 leetCode对应编号:206,141,21,19,876
    • 栈是一种受限的数据结构
    • 先进后出
    • 只能将节点添加在栈的末尾
    • 取元素的时候,只能从后面取
  • 队列

    • 队列是另外一种受限的数据结构
    • 先进先出
    • 将节点添加在队列的尾端
    • 取元素的时候,从队列的前端取
原文地址:https://www.cnblogs.com/clearfix/p/12750181.html