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)另外在空间上,数组在内存上是连续分配的,而链表则非连续分配。这一点使得当数组过大时可能会出现内存分配问题,而链表则不会。
相关推荐
这种差异会影响到数组和链表的使用场景。 2. 内存布局 数组在内存中是连续的,即数组的每个元素在内存中是相邻的。链表在内存中是不连续的,即链表的每个元素在内存中的地址是随机的。这也会影响到数组和链表的...
Java 中链表和数组的区别 Java 中链表和数组都是数据结构,但它们有着本质的差异。在这篇文章中,我们将探讨链表和数组的区别,並探讨它们各自的特点、优缺点和应用场景。 数组 数组是一种线性结构,可以直接索引...
《基于链表和数组的学生信息管理系统(C语言)可运行》 在计算机科学领域,数据结构和算法是编程的基础,而学生信息管理系统是常见的实践项目,它有助于学习者理解和运用这些概念。本项目以C语言为开发工具,通过...
链表和数组的区别 链表和数组是两种常用的数据结构,它们之间有着本质的区别。本文将从内存占用、大小可变性、查询效率、增删效率等方面对链表和数组进行比较。 一、内存占用 数组需要连续的内存空间,而链表不...
链表和数组的区别各有什么优缺点 链表和数组是两种常用的数据结构,它们在编程中扮演着重要的角色。数组是一组具有相同类型和名称的变量的集合,每个数组元素都有一个编号,即下标,我们可以通过下标来区别这些元素...
递归函数可能被设计为通用,能够适应不同类型的数组和链表。 3. `ListInterface.java`:可能是一个接口,定义了链表操作的规范,如添加、删除和遍历。`ChainList.java`可能实现了这个接口。 4. `Node.java`:这是...
链表和数组的区别在哪里?(精) 数组和链表.ppt
本教程将深入探讨如何对链表数组进行赋值,这对于理解数据结构的操作和优化算法设计至关重要。 链表数组,顾名思义,是链表和数组的结合体,即数组中的每个元素都是一个链表。这种结构常用于需要同时处理多个独立...
在链表归并排序中,我们需要定义一个链表节点结构体,包括节点的值和指向下一个节点的指针。然后,我们可以使用递归的方法来实现链表归并排序。首先,我们需要找到链表的中间节点,然后将链表分解成两个子链表,接着...
总的来说,约瑟夫环问题的解决方法展示了数组和链表两种数据结构的应用,同时也体现了动态规划和循环结构在解决问题中的重要性。通过理解和实践这两种实现,不仅可以提升编程技能,还能深入理解数据结构和算法在解决...
然而,数组需要移动大量元素以填补空位或创建新空间,因此在插入和删除操作上,链表通常比数组更高效。 4. 空间效率:数组在预先分配空间时比较节省,因为所有元素都在同一块内存中。而链表可能需要额外的空间来...
链表擅长处理动态变化的数据集合,尤其在插入和删除操作频繁时,而数组则在查询和保持元素顺序访问时表现出色。在实际编程中,选择使用哪种数据结构取决于具体的应用需求和性能优化目标。理解这两种数据结构的特性,...
数组和链表是两种常见的线性数据结构,它们在逻辑结构和内存管理上有显著的差异。 首先,从逻辑结构的角度来看,数组是一种顺序存储的数据结构,其中每个元素都有一个唯一的索引或下标,通过这个下标可以直接访问到...
数组和链表是两种基本的数据结构,它们在存储和访问数据方面有显著的差异,各自具有独特的优点和适用场景。了解这些区别对于理解和优化算法至关重要。 首先,数组是一种线性的数据结构,其特点是所有元素在内存中是...
在Java等编程语言中,ArrayList和LinkedList分别是基于数组和链表实现的集合类。ArrayList本质上是动态数组,查询速度快,但插入和删除慢,且线程不安全。LinkedList作为链表实现,查询慢但增删快,同样线程不安全。...
在Java编程中,数据结构是基础,而数组和链表是两种常见的线性数据结构。它们各有特点,适用于不同的场景。下面将详细讨论这两种数据结构的区别。 首先,数组是一种静态分配内存的数据结构,其所有元素在内存中是...
在编程领域,数组和链表是两种非常基础且重要的数据结构。它们各有优缺点,适用于不同的场景。本篇文章将深入探讨数组和链表的基本操作,包括排序、插入和删除,帮助你更好地理解和运用这两种数据结构。 数组是一种...
在本实训项目中,我们将深入学习C语言编程,并利用核心数据结构——链表和数组,构建一个学生管理系统。这个系统将模拟实际的学生信息管理过程,包括添加学生信息、删除学生信息、查找学生以及显示所有学生信息等...
在这个话题中,我们将重点关注两种常见的数据结构——链表和数组,并探讨它们如何被用来实现栈这一特定的抽象数据类型。 栈是一种线性数据结构,遵循后进先出(LIFO)的原则,意味着最后进入的元素最先被移出。栈的...
这份名为"图+查找+排序+循环链表+循环链表+数组+广义表+二叉树与树的转换+哈夫曼树.pptx"的文档涵盖了多个关键知识点,下面将对这些主题进行详细解释。 1. **数组**:数组是最基本的数据结构,它允许存储具有相同...