线性数据结构之数组、链表及其遍历

171 阅读2分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

数组

批注 2021-06-02 225439.png

数组特性:

  • 存储在物理空间上是连续。
  • 底层的数组长度是不可变的。
  • 数组的变量,指向了数组第一个元素的位置。

a[0],a[1]方括号表示存储地址的偏移。里面的数字表示偏移多少个位置 优点:查询性能好。(指定查询某个位置。)
缺点:

  • 因为空间必须是连续的,所以如果数组比较大,当系统的空间碎片比较多时,容易存不下。
  • 因为数组长度是固定的,所以数组的内容难以被添加和删除。

链表

批注 2021-06-02 224526.png

如果想传递一个链表,必须传递链表的根节点,每一个节点,都认为自己是根节点。

链表的特点:
空间上不是连续的。
每存一个值,都要开销一个引用空间。
优点:
只要内存够大,就能存的下,不用担心空间碎片的问题。
链表的添加和删除非常的容易。
缺点:
查询速度慢(指的是查询某个位置。)
链表上的每一个节点都需要创建一个指向next的引用,浪费一些空间。(当节点内数据越多的时候,这部分开销的内存影响越少。)

遍历

遍历:将一个集合中的每一个元素进行获取并查看。

数组的递归遍历:

var arr = [1,2,3,4,5,6,7,8];
function bianArr(arr,i){
    if (arr != null || arr.length <= 1) return;
        console.log(arr[i]);
        bainArr(arr, i + 1);   
}
bainArr(arr,0);

链表的递归遍历:

function Node (value){
    this.value = value;
    this.next = null;
}
var node1 = new Node(1);
var node2 = new Node(2);
var node3 = new Node(3);
var node4 = new Node(4);
var node5 = new Node(5);

node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;

function bainLink(root){
    if(root == null) return;
    console.log(root.value);
    bainLink(root.next);
}
bainLink(node1);