百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

数据结构:链表的常见操作(插入、删除、查找)

ztj100 2024-11-16 02:55 25 浏览 0 评论

链表是一种基础且重要的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。在C#中,链表可以通过内置的LinkedList<T>类来实现,也可以自定义节点类和链表类来实现更复杂的操作。在本文中,我们将介绍如何在C#中执行链表的常见操作:插入、删除和查找。

链表的插入操作

链表的插入操作可以分为三种:在链表的开头插入、在链表的末尾插入和在链表的中间插入。

在链表的开头插入

在链表的开头插入节点是一个简单的操作。使用内置的LinkedList<T>类,我们可以使用AddFirst方法。

LinkedList<int> list = new LinkedList<int>();
list.AddFirst(3); // 链表:3
list.AddFirst(2); // 链表:2 -> 3
list.AddFirst(1); // 链表:1 -> 2 -> 3

在链表的末尾插入

在链表的末尾插入节点同样很简单。我们可以使用AddLast方法。

LinkedList<int> list = new LinkedList<int>();
list.AddFirst(3); // 链表:3
list.AddFirst(2); // 链表:2 -> 3
list.AddFirst(1); // 链表:1 -> 2 -> 3

list.AddLast(4); // 链表:1 -> 2 -> 3 -> 4
list.AddLast(5); // 链表:1 -> 2 -> 3 -> 4 -> 5

foreach (var item in list)
{
    Console.WriteLine(item);
}

在链表的中间插入

在链表的中间插入稍微复杂一些,因为我们需要先找到插入位置的前一个节点。使用LinkedList<T>类时,我们可以使用AddAfter或AddBefore方法。

LinkedListNode<int> node = list.Find(3);
if (node != null)
{
    list.AddAfter(node, 3); // 链表:1 -> 2 -> 3 -> 3 -> 4 -> 5
}

链表的删除操作

链表的删除操作主要有两种:删除特定的节点和删除具有特定值的节点。

删除特定的节点

删除特定节点时,我们可以直接使用Remove方法。

LinkedListNode<int> nodeToRemove = list.Find(3);
if (nodeToRemove != null)
{
    list.Remove(nodeToRemove); // 链表:1 -> 2 -> 3 -> 4 -> 5
}

删除具有特定值的节点

要删除具有特定值的节点,我们可以使用重载的Remove方法。

list.Remove(2); // 链表:1 -> 3 -> 4 -> 5

链表的查找操作

查找操作是链表中最基本的操作之一。我们可以查找具有特定值的节点。

查找具有特定值的节点

LinkedListNode<int> foundNode = list.Find(4);
if (foundNode != null)
{
    Console.WriteLine(#34;Found node with value: {foundNode.Value}");
}
else
{
    Console.WriteLine("Node not found.");
}

自定义链表类的操作

当使用自定义链表类时,我们需要手动实现插入、删除和查找的逻辑。以下是一个简单的单向链表节点类和链表类的示例:

自定义节点类

public class ListNode<T>
{
    public T Value { get; set; }
    public ListNode<T> Next { get; set; }

    public ListNode(T value)
    {
        Value = value;
        Next = null;
    }
}

自定义链表类

public class CustomLinkedList<T>
{
    public ListNode<T> Head { get; private set; }

    public void AddFirst(T value)
    {
        ListNode<T> newNode = new ListNode<T>(value)
        {
            Next = Head
        };
        Head = newNode;
    }

    public void AddLast(T value)
    {
        ListNode<T> newNode = new ListNode<T>(value);
        if (Head == null)
        {
            Head = newNode;
            return;
        }
        ListNode<T> current = Head;
        while (current.Next != null)
        {
            current = current.Next;
        }
        current.Next = newNode;
    }

    public bool Remove(T value)
    {
        ListNode<T> current = Head;
        ListNode<T> previous = null;
        while (current != null)
        {
            if (current.Value.Equals(value))
            {
                if (previous == null)
                {
                    Head = current.Next;
                }
                else
                {
                    previous.Next = current.Next;
                }
                return true;
            }
            previous = current;
            current = current.Next;
        }
        return false;
    }

    public ListNode<T> Find(T value)
    {
        ListNode<T> current = Head;
        while (current != null)
        {
            if (current.Value.Equals(value))
            {
                return current;
            }
            current = current.Next;
        }
        return null;
    }
}

使用自定义链表类的操作

CustomLinkedList<int> customList = new CustomLinkedList<int>();
customList.AddFirst(10);
customList.AddLast(20);
customList.AddLast(30);
customList.AddFirst(5);

ListNode<int> node = customList.Find(20);
if (node != null)
{
    Console.WriteLine(#34;Found node with value: {node.Value}");
}
else
{
    Console.WriteLine("Node not found.");
}

bool isRemoved = customList.Remove(10);
Console.WriteLine(#34;Node with value 10 removed: {isRemoved}");

总结

在C#中,链表的插入、删除和查找操作可以通过内置的LinkedList<T>类轻松实现,也可以通过自定义链表类来提供更多的控制和灵活性。通过上述例子,我们可以看到如何在实际场景中应用这些操作。理解和掌握这些基本操作对于深入学习数据结构和算法是非常重要的。

相关推荐

Jquery 详细用法

1、jQuery介绍(1)jQuery是什么?是一个js框架,其主要思想是利用jQuery提供的选择器查找要操作的节点,然后将找到的节点封装成一个jQuery对象。封装成jQuery对象的目的有...

前端开发79条知识点汇总

1.css禁用鼠标事件2.get/post的理解和他们之间的区别http超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。HTTP的工作方式是客户机与服务器之间的请求-应答协议。...

js基础面试题92-130道题目

92.说说你对作用域链的理解参考答案:作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。...

Web前端必备基础知识点,百万网友:牛逼

1、Web中的常见攻击方式1.SQL注入------常见的安全性问题。解决方案:前端页面需要校验用户的输入数据(限制用户输入的类型、范围、格式、长度),不能只靠后端去校验用户数据。一来可以提高后端处理...

事件——《JS高级程序设计》

一、事件流1.事件流描述的是从页面中接收事件的顺序2.事件冒泡(eventbubble):事件从开始时由最具体的元素(就是嵌套最深的那个节点)开始,逐级向上传播到较为不具体的节点(就是Docu...

前端开发中79条不可忽视的知识点汇总

过往一些不足的地方,通过博客,好好总结一下。1.css禁用鼠标事件...

Chrome 开发工具之Network

经常会听到比如"为什么我的js代码没执行啊?","我明明发送了请求,为什么反应?","我这个网站怎么加载的这么慢?"这类的问题,那么问题既然存在,就需要去解决它,需要解决它,首先我们得找对导致问题的原...

轻量级 React.js 虚拟美化滚动条组件RScroll

前几天有给大家分享一个Vue自定义滚动条组件VScroll。今天再分享一个最新开发的ReactPC端模拟滚动条组件RScroll。...

一文解读JavaScript事件对象和表单对象

前言相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScrip...

Python函数参数黑科技:*args与**kwargs深度解析

90%的Python程序员不知道,可变参数设计竟能决定函数的灵活性和扩展性!掌握这些技巧,让你的函数适应任何场景!一、函数参数设计的三大进阶技巧...

深入理解Python3密码学:详解PyCrypto库加密、解密与数字签名

在现代计算领域,信息安全逐渐成为焦点话题。密码学,作为信息保护的关键技术之一,允许我们加密(保密)和解密(解密)数据。...

阿里Nacos惊爆安全漏洞,火速升级!(附修复建议)

前言好,我是threedr3am,我发现nacos最新版本1.4.1对于User-Agent绕过安全漏洞的serverIdentitykey-value修复机制,依然存在绕过问题,在nacos开启了...

Python模块:zoneinfo时区支持详解

一、知识导图二、知识讲解(一)zoneinfo模块概述...

Golang开发的一些注意事项(一)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

Python鼠标与键盘自动化指南:从入门到进阶——键盘篇

`pynput`是一个用于控制和监控鼠标和键盘的Python库...

取消回复欢迎 发表评论: