数组与链表都是数据结构,并且都是存储特定数据类型。
数组存储的特点:存储的内存地址是连续的。
优点:数据是存放在一个连续的内存地址的上,查找效率比较高。
缺点:在改变数据个数的时候[增加、插入、删除]效率较低。
链式结构的存储特点:[链表]数据在内存中可以在任意位置,通过引用来关联数据。
优点:链表是将每个对象存放在独立的结点中(每个结点还存放着下一个结点的引用),插入与删除的效率较高。
缺点:查找元素以及收索元素的效率较低。
数据结构一般都要实现存放、取出、删除、修改、数量这几个操作,所以下面就用实例来真正的了解一下数组链表的区别
/**
* 自定义长度可变的数组[泛型]
*
* @author Administrator
*
*/
public class MyArray<E> {
// 定义一个长度为0的初始数组
private Object[] src = new Object[0];
/**
* 存放数据
*
* @param s
* 要存放的数据
*/
public void add(E s) {
// 定义一个新数组长度是源数组长度+1
Object[] dest = new Object[src.length + 1];
// 将原数组的数据拷贝到新数组中
System.arraycopy(src, 0, dest, 0, src.length);
// 将新数据放到新数组的最后一个位置
dest[dest.length - 1] = s;
// 将原数组指向新数组
src = dest;
}
/**
* 取出数据
*
* @param index
* 要取出的数据的下标
*/
public E get(int index) {
Object s = src[index];
return (E)s;
}
/**
* 根据下标删除数据
*
* @param index
* 要删除的数据的下标
*/
public void delete(int index) {
Object[] dest = new Object[src.length-1];
//将下标小于index的拷贝到新数组对应的下标位置
System.arraycopy(src, 0, dest, 0, index);
//将下标大于index的拷贝到新数组下标的位置为原数组的下标位置-1
System.arraycopy(src, index+1, dest, index, src.length-index-1);
//将src指向新数组
src=dest;
}
/**
* 删除指定的数据
*
* @param s
* 要删除的数据,如果有重复的数据,就删除下标最小的
*/
public void delete(E s) {
int t=-1;
for(int i=0;i<src.length;i++){
if(src[i].equals(s)){
t=i;
break;
}
}
//如果s在数组中出现过,t一定会>=0
if(t>=0){
delete(t);
}
}
/**
* 将数据插入到指定位置
* @param index 要插入的位置
* @param s 要插入的数据
*/
public void insert(int index,E s){
Object[] dest = new Object[src.length+1];
//将新数据放到新数组的指定位置
dest[index]=s;
//将下标小于index的数据拷贝到新数组对应的下标位置
System.arraycopy(src, 0, dest, 0, index);
//将下标>=index的数据宝贝到新数组下标+1的位置
System.arraycopy(src, index, dest, index+1, src.length-index);
src=dest;
}
/**
* 修改数据
*
* @param index
* 要修改的数据的下标
* @param s
* 修改后的数据
*/
public void update(int index, E s) {
src[index] = s;
}
/**
* 获得数据个数
*/
public int size() {
return src.length;
}
}
/**
* 自定义链表类【双向链表】
* @author Administrator
*
*/
public class MyLinkList<E> {
//初始状态下,链表没有任何结点,头结点为null
private Node<E> head = null;
//初始状态下,链表没有任何结点,尾结点为null
private Node<E> last = null;
private int num=0;//数据个数
//增加数据
public void add(E e){
//根据数据创建结点对象
Node<E> node = new Node<E>(e);
//如果链表中已经有结点, 就将node作为last的下一个结点
if(last!=null){
last.next = node;
node.front=last;
last = node;
}else{
//如果链表中还没有结点,node就是第一个结点。既是头结点,又是尾结点
head = node;
last = node;
}
num++;
}
//插入结点
public void insert(int index,E e){
//创建新结点
Node<E> node = new Node<E>(e);
//找到index位置的结点
Node<E> n1 = getNode(index);
//找到n1的前一个结点
Node <E> n2 = n1.front;
//找到结点之后实现“插入”这个具体步骤
n2.next=node;
node.front=n2;
node.next=n1;
n1.front=node;
//插入数值之后,结点的长度会增加。
num++;
}
//根据'下标'删除结点
public void delete(int index){
//找到index位置的结点
Node<E> n1 = getNode(index);
//找到n1的前一个结点,以及n1的后一个结点
Node <E> n2 = n1.front;
Node <E> n3 = n1.next;
n2.next=n3;
n3.front=n2;
num--;
}
//修改结点
public void update(int index,E e){
Node<E> n1 = getNode(index);
n1.data =e;
}
//输出结点
public E get(int index){
Node<E> node = getNode(index);
return node.data;
}
//根据下标确定结点
private Node<E> getNode(int index){
int t = -1;
if(index >= 0&& index <num){
Node<E> n = head;
while(n!=null){
t++;
if(t==index){
break;
}
n = n.next;
}
return n;
}else{
//抛出异常
throw new IndexOutOfBoundsException("下标超出边界! index:"+index+",size:"+num);
}
}
//结点的长度
public int size(){
return num;
}
}
//内部结点类,主要是为MyLinkList类服务 (如果放置在MyLinkList类里面,可以定义为私有的,放在外面,还可以为这个包去使用)
class Node<E> {
//节点的数据
E data;
//对下一个结点的引用
Node<E> next;
//对前一个结点的引用
Node<E> front;
//创建结点对象的时候必须制定数据
public Node(E e){
data = e;
}
}
分享到:
相关推荐
数组和链表的区别 在计算机科学中,数组和链表是两种基本的数据结构,它们都广泛应用于软件开发和算法设计中。然而,数组和链表有着根本的区别,这些区别决定了它们在不同的场景下的应用。 数组 数组是一种连续...
"Python列表是数组还是链表实现的?-数组和链表结构(Python)" Python列表是一个非常常用的数据结构,但是它究竟是数组还是链表实现的?在Python中,列表是使用链表结构实现的,但是在某些情况下,也可以使用数组...
遍历数组和链表 在计算机科学中,数组和链表是两种基本的数据结构,它们之间有着很大的不同,影响着程序的性能和效率。本文将从遍历数组和链表的角度,比较它们之间的差异,探讨数组和链表的优缺点,并分析为什么...
数组与此不同:你知道其中每个元素的地址。例如,假设有一个数组,它包含五个元素,起始地址为00,那么元素#5的地址是多少呢?只需执行简单的数学运算就知道:04。需要随机地读取元素时,数组的效率很高,因为可以...
3-软件课程设计补充知识-数组和链表 数组和链表.ppt
数组和链表的时间复杂度 在计算机科学中,时间复杂度是衡量算法性能的重要指标之一。不同的数据结构在各种操作下的时间复杂度也各不相同。以数组和链表为例,我们可以看到它们在插入、删除、随机访问等操作中的时间...
1. 插入与删除:链表在插入和删除操作上表现优秀,只需要改变相邻节点的指针,时间复杂度为O(1),尤其当操作发生在链表头部或尾部时,无需移动其他元素。 2. 内存利用率:链表可以在内存不连续的地方存储节点,只要...
### 数组与链表的对比分析 #### 引言 数据结构是计算机科学中的一个重要概念,它涉及到如何组织、管理和存储数据,以便于高效地访问和修改数据。本篇文章主要探讨的是两种基本的数据结构——数组与链表。通过对比...
"c语言数组与链表转化-分别用数组和链表实现堆栈(C语言版)" 本资源主要讲解了使用C语言实现堆栈的两种方法:使用数组和链表。堆栈是一种常用的数据结构,它可以用来实现递归算法、表达式求值、语法分析等。 第一...
数组、链表、队列、栈的区别和联系 在数据结构中,数组、链表、队列、栈是四种常用的数据结构,它们之间有着紧密的联系,但同时也存在着许多区别。本文将详细介绍数组、链表、队列、栈的区别和联系。 一、数组和...
数组和链表的使用场景 在计算机科学中,数组和链表是两种基本的数据结构,它们都是线性表的实现方式,但它们有着不同的存储结构和访问方式,从而导致不同的使用场景。 数组是一种连续存储的数据结构,即在内存中...
"C++数组模拟链表" C++中的链表是数据结构中非常重要的一部分,而在链表中,我们可以使用数组来模拟链表的结构。今天,我们将讨论如何使用数组来模拟链表,并实现链表的插入和遍历操作。 首先,我们需要了解链表的...
在Java中,HashMap的实现方式有多种,本文将介绍使用数组和链表的方式简单实现HashMap的增删改功能。 HashMap的数据结构 HashMap的数据结构主要由三个部分组成:数组、链表和红黑树。数组用于存储键值对,链表用于...
Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树) 在Java集合中,HashMap是一个常用的数据结构,它基于Map接口实现,元素以键值对的方式存储,并且允许使用null键和null值。由于key不允许...
数组和链表作为两种基础的线性数据结构,在实际编程中有着广泛的应用。本文将深入探讨数组和链表的内部机制、性能特点、适用场景以及它们在现代编程语言中的实现方式。 数组和链表各有优势和局限,它们在不同的应用...
今天,我们将深入探讨C语言中链表数组的实现和数组与链表结构的对比,并结合个人理解和实践经验来分析它们的优缺。 一、链表数组的实现 链表是一种常见的数据结构,它由多个节点组成,每个节点包含数据域和指针域...
本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...
数组和链表的区别浅析 数组和链表.pdf