算法-数组和链表

144 阅读2分钟

数组(Array)是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据

为什么数组要从0开始编号,而不是从1开始

从数组存储的内存模型上来看,"下标"最确切的定义应该是"偏移(offset)"。如果用a来表现数组的首地址,a[0]就是偏移为0的位置

线性表(Linear List) 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表,队列,栈等也是线性表

线性表相对应的概念是非线性表,比如二叉树,堆,图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系

因为连续的内存空间和相同类型的数据。因为这两个限制,它才有了一个堪称”杀手锏“的特性:“随机访问” 。但是这两个限制让数组的很多操作变得非常低效,比如想在数组中删除,插入一个数据,为了保证连续性,就需要做大量的数据搬移工作

链表通过指针将一组零散的内存块串联在一起,其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。我们把记录下一个结点的指针叫做 后继指针

单链表插入结点 A和B之间插入X,B是A的下一个结点, 如果A->next = X ,X->next = A->next 这样会造成X的next指向自身 正确的写法是 X->next = A->next A->next = X

删除X结点 A->next = A->next->next

回文算法

单链表翻转

链表中环的检测

两个有序表的合并

删除链表倒数第n个结点

求链表的中间结点

三数之和

多数元素

缺失的第一个正数

环形链表

合并K个升序链表

后进者先出,先进者后出,这就是典型的“栈”结构

栈可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫做顺序栈,用链表实现的栈,我们叫做链式栈。

队列

队列;跟栈一样,也是一种抽象的数据结构。它具有先进先出的特性,支持在队尾插入元素,在队头产出元素

跟栈一样,队列可以用数组来实现,也可以用链表来实现。用数组实现的栈叫做顺序栈,用链表来实现叫做链式栈。同样,用数组实现的队列叫做顺序队列,用链表实现的队列叫做链式队列。