11.LinkedList

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循环遍历

  1. 从头到尾遍历
LinkedListNode<int> nowNode = linkedList.First;
while (nowNode != null)
{
    Console.WriteLine(nowNode.Value);
    nowNode = nowNode.Next;
    // 10
    // 10
    // 11
    // 1
    // 2
    // 3
}
  1. 从尾到头遍历
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

×

喜欢就点赞,疼爱就打赏