数组和链表

作者: 胡子先生丶 | 来源:发表于2018-11-11 14:03 被阅读6次

定义:

  1. 数组:是一种线性的数据结构,用一组连续的内存空间来存储的具有相同数据类型的数据;
  2. 链表:跟数组一样也是也是一种线性的数据结构,链表的内存结构不是连续性,是将一组零散的内存块串联起来,从而进行数据存储的结构;链表中的每一个内存块被称为节点Node,节点除了存储数据外,还需要记录下一个节点的地址。(单链表、循环链表、双向链表)


    1.png

时间复杂度:

  1. 数组:插入、删除的时间复杂度为O(n),因为需要保持数组内存空间的连续性,需要插入(删除)的数据往后(前)移动;查找的的时间复杂度为O(1),根据下标能直接找到数据;
  2. 链表:插入、删除的时间复杂度为O(1);查找的的时间复杂度为O(n):因为链表的存储空间是不连续性的(数据并非联系存储的),只能通过指针一个个的往下遍历


    452e943788bdeea462d364389bd08a17.jpg

缺点:

  1. 数组:1)需要连续的内存空间;2)大小固定,如果存储空间不足,需要进行扩容就会申请一个更大的空间,将数据拷贝过去,而数据拷贝的操作是非耗时的;
  2. 链表:对链表进行频繁的插入和删除操作,会导致频繁的内存申请和释放,容易造成内存碎片
    public class LinkedList<T>
    {
        public Node<T> Head { get; set; }

        public LinkedList()
        {
            this.Head = null;
        }


        /// <summary>
        /// 节点插入到最后
        /// </summary>
        /// <param name="item"></param>
        public void Insert(T item)
        {
            Node<T> operNode = new Node<T>(item);
            Node<T> current = new Node<T>();

            if (Head == null)
            {
                Head = operNode;
                return;
            }

            current = Head;
            while (current.Next != null)
            {
                current = current.Next;
            }

            current.Next = operNode;
        }

        /// <summary>
        /// 删除第i个节点
        /// </summary>
        /// <param name="i"></param>
        public void Delete(int i)
        {
            Node<T> temp = new Node<T>();
            Node<T> p = new Node<T>();

            if (i == 1)
            {
                Head = Head.Next;
                return;
            }

            temp = Head;

            int j = 1;
            while (temp.Next != null && j < i)
            {
                j++;
                p = temp;
                temp = temp.Next;
            }

            if (j == i)
            {
                p.Next = temp.Next;
            }
        }
    }

    public class Node<T>
    {
        public Node(T item)
        {
            this.Data = item;
            this.Next = null;
        }
        public Node()
        {
            this.Data = default(T);
            this.Next = null;
        }


        public T Data { get; set; }

        public Node<T> Next { set; get; }
    }

相关文章

  • iOS知识复习笔记(19)---数据结构和算法1

    数组和链表的区别 数组静态分配内存,链表动态分配内存 数组内存中连续,链表不连续 数组元素在栈区,链表在堆区 数组...

  • 数据结构和算法

    线性结构 数组、 单链表和双链表 数组和链表区别: 数组:数组元素在内存上连续存放,可以通过下标查找元素;插入、删...

  • Redis-第十章节-链表

    目录 数组和链表 链表 对比 总结 1、数组和链表 数组: 数组会在内存中开辟一块连续的空间存储数据,这种存储...

  • 数据结构——链表

    目录 1、属性 2、链表和数组的区别 2.1、数组概述 2.2、数组和链表优缺点 2.3、链表和数组的比较 3、单...

  • 链表

    链表和数组一样也支持查找,插入,删除操作。最常见的三种链表是:单链表,双链表和循环链表。 链表和数组的区别:数组需...

  • C语言指针部分说明

    二级指针 函数指针 数组和链表 访问数组 访问链表 Makefile

  • 算法小专栏:选择排序

    本篇将重点介绍选择排序,在讲解选择排序之前,我们先复习一下数组和链表等知识。 一、数组 or 链表? 数组和链表作...

  • HashMap 相关面试题及其解答

    Q:HashMap 的数据结构?A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 ...

  • 这21个刁钻的HashMap面试题,我把阿里面试官吊打了

    1:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过...

  • 面试:HashMap 夺命二十一问!

    1:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过...

网友评论

本文标题:数组和链表

本文链接:https://www.haomeiwen.com/subject/kxvxfqtx.html