11.常用泛型数据结构类-LinkedList
11.1 知识点
LinkedList的概念
LinkedList是一个C#为我们封装好的类,它的本质是一个可变类型的泛型双向链表。
LinkedList的申明
需要引用命名空间 using System.Collections.Generic
。
LinkedList<int> linkedList = new LinkedList<int>(); // int类型的链表
LinkedList<string> linkedList2 = new LinkedList<string>(); // string类型的链表
链表对象需要掌握两个类,一个是链表本身,一个是链表节点类LinkedListNode
。可以进去LinkedList
类里面看。
LinkedList的增删查改和遍历
增
AddLast方法:在链表尾部添加元素。
linkedList.AddLast(10);
linkedList.AddLast(1);
linkedList.AddLast(2);
linkedList.AddLast(3);
linkedList.AddLast(4);
AddFirst方法:在链表头部添加元素。
linkedList.AddFirst(20);
AddAfter方法:在指定节点之后添加一个节点。
LinkedListNode<int> node1 = linkedList.Find(20);
linkedList.AddAfter(node1, 15);
AddBefore方法:在指定节点之前添加一个节点。
LinkedListNode<int> node2 = linkedList.Find(1);
linkedList.AddBefore(node2, 11);
删
RemoveFirst方法:移除头节点。
linkedList.RemoveFirst();
RemoveLast方法:移除尾节点。
linkedList.RemoveLast();
Remove方法:移除指定节点。
linkedList.Remove(20);
查
First属性:返回头节点。
LinkedListNode<int> first = linkedList.First;
Last属性:返回尾节点。
LinkedListNode<int> last = linkedList.Last;
Find方法:找到指定值的节点,找不到返回空。
LinkedListNode<int> node3 = linkedList.Find(3);
Console.WriteLine(node3.Value); // 3
node3 = linkedList.Find(5); // 这个node是空
Contains方法:判断是否存在。
if (linkedList.Contains(1))
{
Console.WriteLine("链表中存在1"); // 链表中存在1
}
改
改节点值,要先得到节点,再修改Value
属性。
Console.WriteLine(linkedList.First.Value); // 15
linkedList.First.Value = 10;
Console.WriteLine(linkedList.First.Value); // 10
遍历
foreach遍历:
遍历直接得到的是节点的值,而不是节点。
foreach (int item in linkedList)
{
Console.WriteLine(item);
// 10
// 10
// 11
// 1
// 2
// 3
}
通过节点while循环遍历:
- 从头到尾遍历
LinkedListNode<int> nowNode = linkedList.First;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Next;
// 10
// 10
// 11
// 1
// 2
// 3
}
- 从尾到头遍历
nowNode = linkedList.Last;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Previous;
// 3
// 2
// 1
// 11
// 10
// 10
}
11.2 知识点代码
using System;
using System.Collections.Generic;
namespace Lesson10_LinkedList
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("LinkedList");
#region 知识点一 LinkedList的概念
//LinkedList是一个C#为我们封装好的类
//它的本质是一个可变类型的泛型双向链表
#endregion
#region 知识点二 LinkedList的申明
//需要引用命名空间
//using System.Collections.Generic
LinkedList<int> linkedList = new LinkedList<int>();//int类型的链表
LinkedList<string> linkedList2 = new LinkedList<string>();//string类型的链表
//链表对象 需要掌握两个类
//一个是链表本身 一个是链表节点类LinkedListNode
//可以进去LinkedList类里面看
#endregion
#region 知识点三 LinkedList的增删查改和遍历
#region 增
//1.AddLast方法 在链表尾部添加元素
linkedList.AddLast(10);
linkedList.AddLast(1);
linkedList.AddLast(2);
linkedList.AddLast(3);
linkedList.AddLast(4);
//2.AddFirst方法 在链表头部添加元素
linkedList.AddFirst(20);
//3.AddAfter方法 在指定节点之后添加一个节点
//要指定节点 先得得到一个节点
LinkedListNode<int> node1 = linkedList.Find(20);
//再调用AddAfter方法
linkedList.AddAfter(node1, 15);
//4.AddBefore方法 在指定节点之前添加一个节点
//要指定节点 先得得到一个节点
LinkedListNode<int> node2 = linkedList.Find(1);
//再调用AddBefore方法
linkedList.AddBefore(node2, 11);
#endregion
#region 删
//1.RemoveFirst方法 移除头节点
linkedList.RemoveFirst();
//2.RemoveLast方法移除尾节点
linkedList.RemoveLast();
//3.Remove方法 移除指定节点
linkedList.Remove(20);
//linkedList类没有提供通过索引直接移除的RemoveAt方法 因为链表一般不涉及下标
//4.清空
//linkedList.Clear();//为方便演示 注释
#endregion
#region 查
//1.First属性 返回头节点
LinkedListNode<int> first = linkedList.First;
//2.Last属性 返回尾节点
LinkedListNode<int> last = linkedList.Last;
//3.Find方法 找到指定值的节点 找不到返回空
//无法直接通过索引获取中间元素 只有遍历查找指定位置元素
LinkedListNode<int> node3 = linkedList.Find(3);
Console.WriteLine(node3.Value);//3
node3 = linkedList.Find(5);//这个node是空
//4.Contains方法判断是否存在
if (linkedList.Contains(1))
{
Console.WriteLine("链表中存在1");//链表中存在1
}
#endregion
#region 改
//改节点值 要先得到节点 再修改Value属性
Console.WriteLine(linkedList.First.Value);//15
linkedList.First.Value = 10;
Console.WriteLine(linkedList.First.Value);//10
#endregion
#region 遍历
Console.WriteLine("&&&&&foreach遍历&&&&&");
//1.foreach遍历
//遍历直接得到的是节点的值 而不是节点
foreach (int item in linkedList)
{
Console.WriteLine(item);
//10
//10
//11
//1
//2
//3
}
Console.WriteLine("&&&&&通过节点while循环遍历&&&&&");
//2.通过节点while循环遍历
Console.WriteLine("&&&&&从头到尾遍历&&&&&");
//从头到尾遍历
LinkedListNode<int> nowNode = linkedList.First;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Next;
//10
//10
//11
//1
//2
//3
}
Console.WriteLine("&&&&&从尾到头遍历&&&&&");
// 从尾到头遍历
nowNode = linkedList.Last;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Previous;
//3
//2
//1
//11
//10
//10
}
#endregion
#endregion
}
}
}
11.3 练习题
使用Linkedlist,向其中加入10个随机整形变量
- 正向遍历一次打印出信息
- 反向遍历一次打印出信息
// 创建链表
LinkedList<int> linkedList = new LinkedList<int>();
// 创建随机对象
Random r = new Random();
// 随机往链表加入10个数
for (int i = 0; i < 10; i++)
{
linkedList.AddLast(r.Next(1, 101));
}
// 正向遍历
LinkedListNode<int> nowNode = linkedList.First;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Next;
}
// 反向遍历
nowNode = linkedList.Last;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Previous;
}
11.4 练习题代码
using System;
using System.Collections.Generic;
namespace Lesson10_练习题
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("LinkedList练习题");
#region 练习题一
//使用Linkedlist,向其中加入10个随机整形变量
//正向遍历一次打印出信息
//反向遍历一次打印出信息
//创建链表
LinkedList<int> linkedList = new LinkedList<int>();
//创建随机对象
Random r = new Random();
//随机往链表加入10个数
for (int i = 0; i < 10; i++)
{
linkedList.AddLast(r.Next(1, 101));
}
//正向遍历
LinkedListNode<int> nowNode = linkedList.First;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Next;
}
//反向遍历
nowNode = linkedList.Last;
while (nowNode != null)
{
Console.WriteLine(nowNode.Value);
nowNode = nowNode.Previous;
}
#endregion
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com