目录
链表的相关知识整理
什么是链表
链表与数组的区别
C#实现链表的基本操作
链表相关的经典题目
首页 后端开发 C#.Net教程 什么是链表?链表与数组的区别?

什么是链表?链表与数组的区别?

Jun 24, 2017 am 09:50 AM
整理 相关 知识

链表的相关知识整理

什么是链表

  链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

链表与数组的区别

  回忆下数组的概念 ,所谓数组,是相同数据类型的元素按一定顺序排列的集合。根据概念我们可以知道数组在内存中连续,链表不连续;由于不同的存储方式导致数组静态分配内存,链表动态分配内存,数组元素在栈区,链表元素在堆区;由于数组在内存中连续,我们可以利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);但是由于数组的连续性数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。总结一下,数组和链表的区别如下
  1.数组静态分配内存,链表动态分配内存
  2.数组在内存中连续,链表不连续
  3.数组元素在栈区,链表元素在堆区
  4.数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
  5.数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。

C#实现链表的基本操作

  以单链表为例,根据链表的定义我们先定义链表节点的数据结构

    public class Node<T>
    {
        private T data;
        private Node<T> next;

        //有参构造函数
        //主要用例实例化需要处理的节点用
        public Node(T item, Node<T> next)
        {
            data = item;
            this.next = next;
        }

        //无参构造函数,用例实例化Node节点
        public Node()
        {
            data = default(T);
            next = null;
        }

        public Node<T> Next
        {
            get { return next; }
            set { this.next = value; }
        }

        public T Data
        {
            get { return data; }
            set { this.data = value; }
        }
    }
登录后复制

  接下来我们来实现链表的操作,构造一个链表,在构造链表里我们定一个头结点的对象,头结点是个很有用的节点,在后续代码中就可以慢慢体会到

    public class MyLinkList<T>
    {
       public Node<T> Head { get; set; }

        //构造器  
        public MyLinkList()
        {
            Head = null;
        }
    }
登录后复制

  1.求链表的长度,思路:从头结点向后访问,直到最后一个节点,代码如下

       public int Length()
        {
            var p = Head;
            int len = 0;
            while (p != null)
            {
                ++len;
                p = p.Next;
            }
            return len;
        }
登录后复制

  2.清空链表,这个就比较奥简单了,直接将头结点置为null 即可,代码如下

        public void Clear()
        {
            Head = null;
        }
登录后复制

  3.同理判断链表是否为空也要用的头结点

        public bool IsEmpty()
        {
            if (Head == null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
登录后复制

  4.在链表的末尾添加新元素,添加新元素,需要先判断链表是否为空,如果为空我们要给头结点赋值,如果不为空需要修改最后一个节点的next指向,代码如下

       public void Append(T item)
        {

            if (Head == null)
            {
                Head = new Node<T>(item, null);
                return;
            }
            var p = new Node<T>();
            p = Head;
            while (p.Next != null)
            {
                p = p.Next;
            }
            p.Next = new Node<T>(item, null);
        }
登录后复制

  5.在单链表的第i个结点的位置前插入一个指定结点,首先需要找到插入的位置,然后修改相邻节点的指向即可, 代码如下

        public void Insert(T item, int i)
        {

            if (IsEmpty() || i < 1 || i > GetLength())
            {
                return;
            }
            //如果在第一个位置插入 则只需要将该节点的next 指向head即可
            if (i == 1)
            {
                var first = new Node<T>(item, null);
                first.Next = Head;
                Head = first;
                return;
            }

            var p = new Node<T>();
            p = Head;
            var left = new Node<T>();
            var right = new Node<T>();
            int j = 1;
            while (p.Next != null && j < i)
            {
                left = p;
                right = p.Next;
                ++j;
            }
            var q = new Node<T>(item, null);
            left.Next = q;
            q.Next = right;
        }
登录后复制

   6.删除指定节点,先找到要删除的前一个结点,然后修改该结点的next指向即可  代码略。。。。

·  7.链表还有删除、获取、查找等操作,基本思想都是一样的,就不一一介绍了

链表相关的经典题目

  1. 求单链表中结点的个数
  2. 将单链表反转
  3. 查找单链表中的倒数第K个结点(k > 0)
  4. 查找单链表的中间结点
  5. 从尾到头打印单链表
  6. 已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序
  7. 判断一个单链表中是否有环
  8. 判断两个单链表是否相交
  9. 求两个单链表相交的第一个节点
  10. 已知一个单链表中存在环,求进入环中的第一个节点
  11. 给出一单链表头指针pHead和一节点指针pToBeDeleted,O(1)时间复杂度删除节点pToBeDeleted

 

好了就撸到这里,题目是剑指offer里的题目,大家可以解答下,有问题联系我

  

 

以上是什么是链表?链表与数组的区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

带你了解相当震撼的win10x系统知识 带你了解相当震撼的win10x系统知识 Jul 14, 2023 am 11:29 AM

  近日,网络中有win10X系统的最新镜像下载流出,不同于常见的ISO,此次的镜像是.ffu格式,目前仅能用于SurfacePro7体验。虽然很多小伙伴不能体验,但是依旧可以看看测评的相关内容,过过瘾,那么一起来看看win10x系统最新评测吧!win10x系统最新评测  1、Win10X与Win10最大的不同首先就表现在开机后开始按钮等被放在了任务栏中央,除了固定的应用程序,任务栏还可以显示最近启动的应用程序,类似于Android和iOS手机。  2、另外一个就是,新系统的“开始”菜单不支持文

Win10桌面图标整理技巧 Win10桌面图标整理技巧 Dec 27, 2023 pm 05:00 PM

使用电脑的小伙伴都希望自己的桌面排列干净看起来整整齐齐但是不知道怎么在win10系统中操作,今天就给你们带来了整理桌面图标win10方法,一起看看吧。整理桌面图标win10怎么整齐:1、右击桌面空白处,点击最上方的“查看”。2、在右侧的窗口中可以看到“自动排列图标”等功能。3、不要勾选“自动排列图标”这样就能够根据自己的需求来摆放图标了。4、而且这些选项是都可以全部选择的,但是这样就没法摆出自己的个性了。

真我手机文件夹建立步骤指南 真我手机文件夹建立步骤指南 Mar 23, 2024 pm 03:51 PM

真我手机文件夹建立步骤指南在日常生活中,我们使用手机来存储各种各样的文件,包括照片、视频、文档等等。然而,随着时间的推移,手机上的文件可能会越来越多,导致手机内存不足或文件难以管理。为了更好地整理文件并提高手机使用效率,手机文件夹的建立变得尤为重要。真我手机是一款受欢迎的智能手机品牌,拥有强大的系统和多样的功能。在真我手机上建立文件夹可以帮助用户更好地整理文

win10系统如何整理磁盘碎片 win10系统如何整理磁盘碎片 Jun 29, 2023 pm 07:41 PM

  win10系统如何整理磁盘碎片?随着电脑的使用率越来越高,我们有时候可能会遇到对win10系统整理磁盘碎片进行设置,如果我们需要对win10系统整理磁盘碎片进行设置时,要怎么处理win10系统整理磁盘碎片呢?很多小伙伴不知道怎操作,小编下面整理了win10系统整理磁盘碎片的详细步骤,如果你感兴趣的话,跟着小编一起往下看看吧!  win10系统整理磁盘碎片的详细步骤:  1.什么样的磁盘需要整理  我们要知道,并不是所有的磁盘都是需要进行碎片整理的,比如非常常见的固态硬盘和移动磁盘类设备。  

了解Golang:开发者必备知识 了解Golang:开发者必备知识 Feb 23, 2024 am 10:51 AM

Golang,又称为Go语言,是一种由Google开发的开源编程语言。自2007年发布以来,Golang在软件开发领域逐渐崭露头角,得到了越来越多开发者的青睐。作为一种静态类型、编译型语言,Golang拥有诸多优点,如高效的并发处理能力、简洁的语法、强大的工具支持等,使其在云计算、大数据处理、网络编程等方面具有广泛应用前景。本文将介绍Golang的基本概念、

聊天机器人是如何通过知识图谱回答问题的? 聊天机器人是如何通过知识图谱回答问题的? Apr 17, 2023 am 09:13 AM

前言1950年,图灵发表了具有里程碑意义的论文《计算机器与智能》(ComputingMachineryandIntelligence),提出了一个关于机器人的著名判断原则——图灵测试,也被称为图灵判断,它指出如果第三者无法辨别人类与AI机器反应的差别,则可以论断该机器具备人工智能。2008年,漫威《钢铁侠》中的AI管家贾维斯,让人们知道了AI是如何精准地帮助人类(托尼)解决丢过来的各种事务的……图1:AI管家贾维斯(图片来源网络)2023年初,以2C的方式从科技界火爆破圈的免费聊天机器人Chat

我们一起聊聊知识抽取,你学会了吗? 我们一起聊聊知识抽取,你学会了吗? Nov 13, 2023 pm 08:13 PM

一、简介知识抽取通常指从非结构化文本中挖掘结构化信息,例如含有丰富语义信息的标签和短语。这在业界被广泛应用于内容理解和商品理解等场景,通过从用户生成的文本信息中提取有价值的标签,将其应用于内容或商品上知识抽取通常伴随着对所抽取标签或短语的分类,通常被建模为命名实体识别任务,通用的命名实体识别任务就是识别命名实体成分并将成分划分到地名、人名、机构名等类型上;领域相关的标签词抽取将标签词识别并划分到领域自定义的类别上,如系列(空军一号、音速9)、品牌(Nike、李宁)、类型(鞋、服装、数码)、风格(

了解Linux服务器安全:必备的知识和技能 了解Linux服务器安全:必备的知识和技能 Sep 09, 2023 pm 02:55 PM

了解Linux服务器安全:必备的知识和技能随着互联网的不断发展,Linux服务器越来越广泛地应用于各个领域。然而,由于服务器存储了大量的敏感数据,其安全性问题也成为了人们关注的焦点。本文将介绍一些必备的Linux服务器安全知识和技能,帮助您保护您的服务器免受攻击。更新和维护操作系统及软件及时更新操作系统和软件是保持服务器安全的重要一环。因为每个操作系统和软件

See all articles