推荐阅读
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
在日常开发中,常常会用到数据集合,那么数据集合是什么呢,数据集合也没有想象中那么复杂。
数据集合就是专门用来存储数据、检索数据,以及对数据一系列操作的类。
这些类有:ArrayList数组、List列表、Queue队列、Dictionary字典、Hashtable哈希表、Stack堆栈。
在开发中,每种数据集合都有优缺点,今天就将这些数据集合进行归纳总结。
一是方便自己捋顺思路,二是可以帮助到对此理解不清晰的开发者。
这是本系列文章的第五篇:
【Unity3D数据集合】(一)数组集合Array学习
【Unity3D数据集合】(二)列表集合List及ListArray学习
【Unity3D数据集合】(三)字典Dictionary和哈希表Hashtable学习
【Unity3D数据集合】(四)堆栈Stack和队列Queue学习
【Unity3D数据集合】(五)链表LinkedList数据集合学习
【Unity3D数据集合】(六)散列集合HashSet和排序集合SortedSet学习
【Unity3D数据集合】(七)排序列表SortedList和排序字典SortedDictionary学习
【Unity3D数据集合】(八)点阵列BitArray学习
二、链表LinkedList集合介绍
这个链表LinkList的概念,在C、C++比较常见,其实在很多计算机编程语言都有链表的概念。
链表也是一种数据结构,用一组任意的存储单元来存储线性表中的数据元素,在存储单元中可以是连续的,也可以是不连续的,链表在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息,这两部分信息组成该数据元素的存储影响,称为节点。
数组和List以及ArrayList都有一个缺陷,就是从数组的中间位置删除或者插入一个元素需要付出很大的代建,原因就是数组中的处于被删除或者被插入元素后面的所有元素都要移动位置。
C#的LinkedList底层是基于链表实现的,基于链表的数据结构,很好的解决了数组删除插入效率低的问题,且不用动态的扩充数组的长度。
有很多教程会讲解如何实现一个链表,或者定义一个链表,C#自己提供了就有链表,我们就讲解C#自带的链表LinkedList。
三、链表LinkList初始化
链表LinkList,主要使用System.Collections.Generic命名空间下的LinkedList创建集合:
LinkedList<T> table = new LinkedList<T>();
这个T就是一个泛型,可以接受各种类型的数据,比如string、int,也可以自定义类型,比如下面的例子:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
LinkedList<int> table;
void Start()
{
table = new LinkedList<int>();
table.AddFirst(123);
table.AddLast(456);
foreach (int item in table)
{
Debug.Log(item);
}
}
}
四、链表LinkedList的增删改查
1、查找数据
因为LinkedList以链表的形式存在,所以不能通过下标进行查找数据,只能通过Find()函数遍历查找元素:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
LinkedList<int> table;
void Start()
{
table = new LinkedList<int>();
table.AddFirst(123);
table.AddLast(456);
LinkedListNode<int> march = table.Find(123);
Debug.Log(march.Value);
}
}
遍历查找元素:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
LinkedList<int> table;
void Start()
{
table = new LinkedList<int>();
table.AddFirst(123);
table.AddLast(456);
foreach (int item in table)
{
Debug.Log(item);
}
}
}
2、修改数据
找到这个链表,就可以进行修改了:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
LinkedList<int> table;
void Start()
{
table = new LinkedList<int>();
table.AddFirst(123);
table.AddLast(456);
LinkedListNode<int> march = table.Find(123);
march.Value = 789;
foreach (int item in table)
{
Debug.Log(item);
}
}
}
3、增加数据
可以通过AddFirst()、AddLast()、AddBefore()、AddAfter()函数来增加数据:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
LinkedList<int> table;
void Start()
{
table = new LinkedList<int>();
table.AddFirst(123);
table.AddLast(456);
LinkedListNode<int> march = table.Find(123);
foreach (int item in table)
{
Debug.Log(item);
}
table.AddBefore(march, 789);
table.AddAfter(march, 012);
foreach (int item in table)
{
Debug.Log(item);
}
}
}
4、删除数据
删除元素主要通过Remove()、RemoveFirst()以及RemoveLast()函数进行删除:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Demo5 : MonoBehaviour
{
LinkedList<int> table;
void Start()
{
table = new LinkedList<int>();
table.AddFirst(123);
table.AddLast(456);
LinkedListNode<int> march = table.Find(123);
foreach (int item in table)
{
Debug.Log(item);
}
table.Remove(march);//删除指定元素
table.RemoveFirst();//删除首元素
table.RemoveLast();//删除尾元素
}
}
五、链表LinkedList的优缺点
链表LinkedList具有泛型的特点,元素不连续分配,每个元素都有记录前后节点。
优点
插入、删除元素效率比较高。
缺点
不能进行下标索引访问,找元素只能遍历查找不方便
访问效率低