常用的数据结构:数组、栈、队列、链表、树、图、堆、散列表
顺序存储:
用一组地址连续的存储单元依次存储线性表的各个数据元素
数组、Stack、Queue、List、ArrayList —— 顺序存储
链式存储:
用一组任意的存储单元存储线性表中的各个数据元素
单向链表、双向链表、循环链表 —— 链式存储
简单的单向链表:
//单向链表节点
class LinkedNode<T>
{
public T value;
//这个存储下个元素是谁 相当与钩子
public LinkedNode<T> nextNode;
//有参构造可以不写
public LinkedNode(T value)
{
this.value = value;
}
}
//单向链表类 管理节点 添加等等
class LinkedList<T>
{
public LinkedNode<T> head;
public LinkedNode<T> last;
public void Add(T value)
{
LinkedNode<T> node = new LinkedNode<T>(value);
if (head == null)
{
head = node;
last = node;
}
else
{
last.nextNode = node;
last = node;
}
}
public void Remove(T value)
{
if (head == null)
{
return;
}
if (head.value.Equals(value))
{
head = head.nextNode;
//如果头节点 被移除 发现头节点变空
//证明只有一个节点 那尾也要清空
if (head == null)
{
last = null;
}
}
LinkedNode<T> node = head;
while (node.nextNode != null)
{
//判断要删除的是否为最后一个
if (node.nextNode.value.Equals(last.value))
{
last = node;
node.nextNode = null;
break;
}
if (node.nextNode.value.Equals(value))
{
//让当前找到的这个元素的上个节点
//指向自己的下个节点
node.nextNode = node.nextNode.nextNode;
break;
}
node = node.nextNode;
}
}
}
internal class Program
{
static void Main(string[] args)
{
LinkedList<int> link = new LinkedList<int>();
link.Add(1);
link.Add(2);
link.Add(3);
link.Add(4);
LinkedNode<int> node = link.head;
while (node != null)
{
Console.WriteLine(node.value);
node = node.nextNode;
}
node = link.head;
link.Remove(1);
while (node != null)
{
Console.WriteLine(node.value);
node = node.nextNode;
}
}
}
顺序存储与链式存储的优缺点:
从增删查改的角度去思考
增: 链式存储 计算上 优于顺序存储 (中间插入时链式不用像顺序一样去移动位置)
删:链式存储 计算上 优于顺序存储 (中间删除时链式不用像顺序一样去移动位置)
查:顺序存储 使用上 优于链式存储 (数组可以直接通过下标得到元素,链式需要遍历)
改:顺序存储 使用上 优于链式存储 (数组可以直接通过下标得到元素,链式需要遍历)