`
汤小润
  • 浏览: 3838 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

链表和数组

阅读更多

1.为了弄清楚链表和数组的区别,首先要做的是实现一个数组和链表。本实例采用Java实现。

 

2.打开记事本,手动编写数组及其增删该查功能。实现的基本思想是,例如对于增加数据,先建立一个数组长度为0,当需要增加时,再建立一个数组,长度比原数组长度增加1。将原数组的所有值赋给新数组,再将要增加的值放到新数组的最后一位即可实现数据增加功能。其他删除、插入和获取数据的方法类似:

 

public class MyQueue{

private Object[] ds = new Object[0];

 

//加入数据

public void add(Object c){

Object[] ns = new Object[ds.length+1];

for(int i=0;i<ds.length;i++){

ns[i] = ds[i];

}

ns[ns.length-1] = c;

ds=ns;

}

 

  //获取数据

public Object get(int index){

return ds[index];

}

 

//删除

public void remove(int index){

Object[] ns = new Object[ds.length-1];

for(int i=0;i<index;i++){

ns[i]=ds[i];

}

for(int i=index;i<(ds.length-1);i++){

ns[i]=ds[i+1];

}

ds=ns;

}

 

//插入

public void insert(Object c,int index){

Object[] ns = new Object[ds.length+1];

for(int i=0;i<index;i++)

ns[i]=ds[i];

ns[index]=c;

for(int i=index;i<ds.length;i++){

ns[i+1]=ds[i];

}

ds=ns;

}

 

public int size(){

return ds.length;

}

}

 

3.如果用链表来实现的话,基本思想的先建立一个Link类,每个Link对象包含它本身的值和它指向的下一个数据的地址(类似于C++中的指针)。对于新增数据,就是把要增添的数据值赋给现在位置,现在位置再指向下一个地址。其他的获取、删除和插入等情况类似:

 

class Link{

Link next;

Object data;

}

 

public class LinkList{

Link root,present;

int size=0;

 

//新增数据

public void add(Object c){

if(root==null){

root = new Link();

root.data=c;

present=root;

}else{

Link next=new Link();

next.data=c;

present.next=next;

present=next;

}

size++;

}

 

//获取数据

public Link get(int index){

if(index>=size){

return null;

}

else{

Link temp=new Link();

temp=root;

for(int i=0;i<index;i++){

temp=temp.next;

}

return temp;

}

}

 

//删除数据

public void delete(int index){

if(index>=size)

System.out.println("Fail!");

else{

Link temp1=get(index-1);

Link temp2=get(index+1);

temp1.next=temp2;

size--;

}

 

}

 

//插入数据

public void insert(int index,Object c){

if(index>=size)

System.out.println("Fail!");

else{

Link temp=new Link();

temp.data=c;

Link temp1=get(index);

Link temp2=get(index-1);

temp2.next=temp;

temp.next=temp1;

}

}

 

public int size(){

return size;

}

 

}

 

4.编写完成后,我们在cmd中编译和测试。首先编写测试文件。将数量级控制在100000:

 

数组和链表分别执行的时间如下:

public class Test{

public static void main(String args[]){

MyQueue qu = new MyQueue();

LinkList ls = new LinkList();

 

long start1 = System.currentTimeMillis();

for(int i=0;i<100000;i++){

qu.add(i);

}

long end1 = System.currentTimeMillis(); 

 

long start2 = System.currentTimeMillis();

Object c=qu.get(8888);

long end2 = System.currentTimeMillis();

 

long start3 = System.currentTimeMillis();

qu.insert(8888,1);

long end3 = System.currentTimeMillis();

 

System.out.println("数组增加运行时间:"+(end1-

start1)+"毫秒");

System.out.println("数组查询运行时间:"+(end2-

start2)+"毫秒");

System.out.println("数组插入运行时间:"+(end3-

start3)+"毫秒");

 

}

}


 

由此可以看出,当数量级为10万时,数组和链表的运行时间就有了较大的差距。链表在插入数据方面的确有着特别快的处理速度。查询方面,数组几乎不要时间。插入方面,链表几乎比数组插入快30倍。并且可以分析得出当要插入的位置下标越大,二者的时间差距也越大。

 

5.分析

由上可知:

(1)数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n)

(2)数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)

(3)另外在空间上,数组在内存上是连续分配的,而链表则非连续分配。这一点使得当数组过大时可能会出现内存分配问题,而链表则不会。

 

 

 

 

 

 

 

 


 

  • 大小: 5.3 KB
分享到:
评论

相关推荐

    集合(链表和数组的区别) 数组和链表.pdf

    这种差异会影响到数组和链表的使用场景。 2. 内存布局 数组在内存中是连续的,即数组的每个元素在内存中是相邻的。链表在内存中是不连续的,即链表的每个元素在内存中的地址是随机的。这也会影响到数组和链表的...

    java中链表和数组的区别? 数组和链表.pdf

    Java 中链表和数组的区别 Java 中链表和数组都是数据结构,但它们有着本质的差异。在这篇文章中,我们将探讨链表和数组的区别,並探讨它们各自的特点、优缺点和应用场景。 数组 数组是一种线性结构,可以直接索引...

    基于链表和数组的学生信息管理系统(C语言)可运行.cpp文件

    《基于链表和数组的学生信息管理系统(C语言)可运行》 在计算机科学领域,数据结构和算法是编程的基础,而学生信息管理系统是常见的实践项目,它有助于学习者理解和运用这些概念。本项目以C语言为开发工具,通过...

    链表和数组的区别 数组和链表.pdf

    链表和数组的区别 链表和数组是两种常用的数据结构,它们之间有着本质的区别。本文将从内存占用、大小可变性、查询效率、增删效率等方面对链表和数组进行比较。 一、内存占用 数组需要连续的内存空间,而链表不...

    链表和数组的区别各有什么优缺点 数组和链表.pdf

    链表和数组的区别各有什么优缺点 链表和数组是两种常用的数据结构,它们在编程中扮演着重要的角色。数组是一组具有相同类型和名称的变量的集合,每个数组元素都有一个编号,即下标,我们可以通过下标来区别这些元素...

    递归方式实现链表和数组的操作.zip

    递归函数可能被设计为通用,能够适应不同类型的数组和链表。 3. `ListInterface.java`:可能是一个接口,定义了链表操作的规范,如添加、删除和遍历。`ChainList.java`可能实现了这个接口。 4. `Node.java`:这是...

    链表和数组的区别在哪里?(精) 数组和链表.ppt

    链表和数组的区别在哪里?(精) 数组和链表.ppt

    如何给链表数组赋值.rar_如何 链表 数组 赋值_链表_链表数组赋值_链表赋值

    本教程将深入探讨如何对链表数组进行赋值,这对于理解数据结构的操作和优化算法设计至关重要。 链表数组,顾名思义,是链表和数组的结合体,即数组中的每个元素都是一个链表。这种结构常用于需要同时处理多个独立...

    归并排序(链表和数组) 数组和链表.pdf

    在链表归并排序中,我们需要定义一个链表节点结构体,包括节点的值和指向下一个节点的指针。然后,我们可以使用递归的方法来实现链表归并排序。首先,我们需要找到链表的中间节点,然后将链表分解成两个子链表,接着...

    约瑟夫环问题(链表和数组)

    总的来说,约瑟夫环问题的解决方法展示了数组和链表两种数据结构的应用,同时也体现了动态规划和循环结构在解决问题中的重要性。通过理解和实践这两种实现,不仅可以提升编程技能,还能深入理解数据结构和算法在解决...

    链表和数组的区别

    然而,数组需要移动大量元素以填补空位或创建新空间,因此在插入和删除操作上,链表通常比数组更高效。 4. 空间效率:数组在预先分配空间时比较节省,因为所有元素都在同一块内存中。而链表可能需要额外的空间来...

    链表和数组的区别与作用应该知道吧 数组和链表.pdf

    链表擅长处理动态变化的数据集合,尤其在插入和删除操作频繁时,而数组则在查询和保持元素顺序访问时表现出色。在实际编程中,选择使用哪种数据结构取决于具体的应用需求和性能优化目标。理解这两种数据结构的特性,...

    链表和数组的区别在哪里? 数组和链表.pdf

    数组和链表是两种常见的线性数据结构,它们在逻辑结构和内存管理上有显著的差异。 首先,从逻辑结构的角度来看,数组是一种顺序存储的数据结构,其中每个元素都有一个唯一的索引或下标,通过这个下标可以直接访问到...

    链表和数组的区别 (2) 数组和链表.pdf

    数组和链表是两种基本的数据结构,它们在存储和访问数据方面有显著的差异,各自具有独特的优点和适用场景。了解这些区别对于理解和优化算法至关重要。 首先,数组是一种线性的数据结构,其特点是所有元素在内存中是...

    链表和数组的区别 (1) 数组和链表.pdf

    在Java等编程语言中,ArrayList和LinkedList分别是基于数组和链表实现的集合类。ArrayList本质上是动态数组,查询速度快,但插入和删除慢,且线程不安全。LinkedList作为链表实现,查询慢但增删快,同样线程不安全。...

    java中链表和数组的区别? (1) 数组和链表.pdf

    在Java编程中,数据结构是基础,而数组和链表是两种常见的线性数据结构。它们各有特点,适用于不同的场景。下面将详细讨论这两种数据结构的区别。 首先,数组是一种静态分配内存的数据结构,其所有元素在内存中是...

    链表 和 数组 的一些简单操作 包括排序 插入 删除

    在编程领域,数组和链表是两种非常基础且重要的数据结构。它们各有优缺点,适用于不同的场景。本篇文章将深入探讨数组和链表的基本操作,包括排序、插入和删除,帮助你更好地理解和运用这两种数据结构。 数组是一种...

    C语言程序设计实训-基于链表、数组的学生管理系统

    在本实训项目中,我们将深入学习C语言编程,并利用核心数据结构——链表和数组,构建一个学生管理系统。这个系统将模拟实际的学生信息管理过程,包括添加学生信息、删除学生信息、查找学生以及显示所有学生信息等...

    Java数据结构篇-链表与数组实现栈.pptx.pptx

    在这个话题中,我们将重点关注两种常见的数据结构——链表和数组,并探讨它们如何被用来实现栈这一特定的抽象数据类型。 栈是一种线性数据结构,遵循后进先出(LIFO)的原则,意味着最后进入的元素最先被移出。栈的...

    图+查找+排序+循环链表+循环链表+数组+广义表+二叉树与树的转换+哈夫曼树.pptx

    这份名为"图+查找+排序+循环链表+循环链表+数组+广义表+二叉树与树的转换+哈夫曼树.pptx"的文档涵盖了多个关键知识点,下面将对这些主题进行详细解释。 1. **数组**:数组是最基本的数据结构,它允许存储具有相同...

Global site tag (gtag.js) - Google Analytics