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

链表的相关知识整理

什么是链表

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

链表与数组的区别

  回忆下数组的概念 ,所谓数组,是相同数据类型的元素按一定顺序排列的集合。根据概念我们可以知道数组在内存中连续,链表不连续;由于不同的存储方式导致数组静态分配内存,链表动态分配内存,数组元素在栈区,链表元素在堆区;由于数组在内存中连续,我们可以利用下标定位,时间复杂度为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    {        private T data;        private Node next;        //有参构造函数        //主要用例实例化需要处理的节点用        public Node(T item, Node next)        {            data = item;            this.next = next;        }        //无参构造函数,用例实例化Node节点        public Node()        {            data = default(T);            next = null;        }        public Node Next        {            get { return next; }            set { this.next = value; }        }        public T Data        {            get { return data; }            set { this.data = value; }        }    }

登录后复制

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

    public class MyLinkList    {       public Node 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(item, null);                return;            }            var p = new Node();            p = Head;            while (p.Next != null)            {                p = p.Next;            }            p.Next = new Node(item, null);        }

登录后复制

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

        public void Insert(T item, int i)        {            if (IsEmpty() || i  GetLength())            {                return;            }            //如果在第一个位置插入 则只需要将该节点的next 指向head即可            if (i == 1)            {                var first = new Node(item, null);                first.Next = Head;                Head = first;                return;            }            var p = new Node();            p = Head;            var left = new Node();            var right = new Node();            int j = 1;            while (p.Next != null && j (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里的题目,大家可以解答下,有问题联系我

  

 

以上就是什么是链表?链表与数组的区别?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2439987.html

(0)
上一篇 2025年3月3日 12:16:59
下一篇 2025年2月27日 02:12:17

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 有关MVC异常情况的相关处理

    这篇文章主要为大家详细介绍了mvc异常处理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下        在日常开发中,我们会去捕捉很多的异常,来进行处理,通常我们的方法就是,在需要进行异常处理的地方加上 try catch 块…

    2025年3月3日 编程技术
    200
  • 了解Golang:开发者必备知识

    Golang,又称为Go语言,是一种由Google开发的开源编程语言。自2007年发布以来,Golang在软件开发领域逐渐崭露头角,得到了越来越多开发者的青睐。作为一种静态类型、编译型语言,Golang拥有诸多优点,如高效的并发处理能力、简…

    2025年3月1日
    200
  • Python之BeautifulSoup库安装及其简介

    一. 前言         在前面的几篇文章中我介绍了如何通过Python分析源代码来爬取博客、维基百科InfoBox和图片,其文章链接如下:        [python学习] 简单爬取维基百科程序语言消息盒        [Python…

    2025年2月27日
    200
  • Python中str相关操作讲解

    下面小编就为大家带来一篇python之str操作方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 1. str.format():使用“{}”占位符格式化字符串(占位符中的索引号形式和键值对形式可以…

    编程技术 2025年2月27日
    200
  • Python有关名字绑定的相关介绍

    python的名字绑定 在Python中,对象是通过名字进行关联和引用的。Python通过名字绑定操作来引入名字。 Python中的所谓的代码块就是一段作为执行单元的程序。比如:模块、函数、类定义。在交互式环境中输入的命令也是代码块的一种。…

    编程技术 2025年2月27日
    200
  • Python文件和流相关知识介绍

    下面小编就为大家带来一篇python文件和流(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 1.文件写入 #打开文件,路径不对会报错f = open(r”C:UsersjmDesktoppyfil…

    编程技术 2025年2月27日
    200
  • Python元组的知识详解

    本文主要和大家分享Python元组的知识详解没希望能帮助到大家。 1、Python的元组与列表类,不同之处:     a、元组的元素不能修改,列表可以。     b、元组使用小括号,列表使用方括号。 2、元组创建很简单,只需要在括号中添加元…

    编程技术 2025年2月27日
    200
  • python学习必备知识汇总

    这篇文章主要介绍了python学习必备知识汇总的相关资料,需要的朋友可以参考下 一、变量1.变量•指在程序执行过程中,可变的量;•定义一个变量,就会伴随有3个特征,分别是内存ID、数据类型和变量值。•其他语言运行完之前,一定要手动把程序的内…

    编程技术 2025年2月27日
    200
  • 如何用python整理附件

    本篇文章给大家整理了关于如何用python整理附件的相关知识点,学习python的朋友可以跟着测试下。 目前我的文件夹中有500多份简历,如果我想知道一些信息,比如学校,学历之类的,我需要打开每一份word去查看,太耗时间了。这个时候pyt…

    2025年2月27日
    200
  • Python中你必须了解的知识

    俗话说的好,千里之行始于足下。无论做什么事情,基础都是最重要的,当你以为自己“精通”某语言的时候,有没有问过自己: “能不能把这些知识,用最简单的话说出来,让不懂的人也能听明白?” 当你真正精通某语言的时候,我相信你一定能做到。如果做不到,…

    2025年2月27日 编程技术
    200

发表回复

登录后才能评论