`
suifan繁
  • 浏览: 18097 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

数组与链表的区别

    博客分类:
  • Java
阅读更多
数组与链表都是数据结构,并且都是存储特定数据类型。

数组存储的特点:存储的内存地址是连续的。
优点:数据是存放在一个连续的内存地址的上,查找效率比较高。
缺点:在改变数据个数的时候[增加、插入、删除]效率较低。

链式结构的存储特点:[链表]数据在内存中可以在任意位置,通过引用来关联数据。
优点:链表是将每个对象存放在独立的结点中(每个结点还存放着下一个结点的引用),插入与删除的效率较高。
缺点:查找元素以及收索元素的效率较低。

数据结构一般都要实现存放、取出、删除、修改、数量这几个操作,所以下面就用实例来真正的了解一下数组链表的区别

/**
 * 自定义长度可变的数组[泛型]
 * 
 * @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;
	}

}
1
0
分享到:
评论

相关推荐

    面试题总结:数组和链表的区别 数组和链表.pdf

    数组和链表的区别 在计算机科学中,数组和链表是两种基本的数据结构,它们都广泛应用于软件开发和算法设计中。然而,数组和链表有着根本的区别,这些区别决定了它们在不同的场景下的应用。 数组 数组是一种连续...

    pythonlist是数组还是链表实现的-数组和链表结构(python)-1 数组和链表.pdf

    "Python列表是数组还是链表实现的?-数组和链表结构(Python)" Python列表是一个非常常用的数据结构,但是它究竟是数组还是链表实现的?在Python中,列表是使用链表结构实现的,但是在某些情况下,也可以使用数组...

    遍历数组和链表 数组和链表.pdf

    遍历数组和链表 在计算机科学中,数组和链表是两种基本的数据结构,它们之间有着很大的不同,影响着程序的性能和效率。本文将从遍历数组和链表的角度,比较它们之间的差异,探讨数组和链表的优缺点,并分析为什么...

    python算法-数组和链表 数组和链表.pdf

    数组与此不同:你知道其中每个元素的地址。例如,假设有一个数组,它包含五个元素,起始地址为00,那么元素#5的地址是多少呢?只需执行简单的数学运算就知道:04。需要随机地读取元素时,数组的效率很高,因为可以...

    3-软件课程设计补充知识-数组和链表 数组和链表.ppt

    3-软件课程设计补充知识-数组和链表 数组和链表.ppt

    数组和链表的时间复杂度 (1) 数组和链表.pdf

    数组和链表的时间复杂度 在计算机科学中,时间复杂度是衡量算法性能的重要指标之一。不同的数据结构在各种操作下的时间复杂度也各不相同。以数组和链表为例,我们可以看到它们在插入、删除、随机访问等操作中的时间...

    数组与链表不同

    1. 插入与删除:链表在插入和删除操作上表现优秀,只需要改变相邻节点的指针,时间复杂度为O(1),尤其当操作发生在链表头部或尾部时,无需移动其他元素。 2. 内存利用率:链表可以在内存不连续的地方存储节点,只要...

    数组和链表的对比分析 数组和链表.docx

    ### 数组与链表的对比分析 #### 引言 数据结构是计算机科学中的一个重要概念,它涉及到如何组织、管理和存储数据,以便于高效地访问和修改数据。本篇文章主要探讨的是两种基本的数据结构——数组与链表。通过对比...

    c语言数组与链表转化-分别用数组和链表实现堆栈(C语言版)(转) 数组和链表.pdf

    "c语言数组与链表转化-分别用数组和链表实现堆栈(C语言版)" 本资源主要讲解了使用C语言实现堆栈的两种方法:使用数组和链表。堆栈是一种常用的数据结构,它可以用来实现递归算法、表达式求值、语法分析等。 第一...

    数组、链表、队列、栈的区别和联系 数组和链表.pdf

    数组、链表、队列、栈的区别和联系 在数据结构中,数组、链表、队列、栈是四种常用的数据结构,它们之间有着紧密的联系,但同时也存在着许多区别。本文将详细介绍数组、链表、队列、栈的区别和联系。 一、数组和...

    数组和链表的使用场景 数组和链表.pdf

    数组和链表的使用场景 在计算机科学中,数组和链表是两种基本的数据结构,它们都是线性表的实现方式,但它们有着不同的存储结构和访问方式,从而导致不同的使用场景。 数组是一种连续存储的数据结构,即在内存中...

    C++——数组模拟链表

    "C++数组模拟链表" C++中的链表是数据结构中非常重要的一部分,而在链表中,我们可以使用数组来模拟链表的结构。今天,我们将讨论如何使用数组来模拟链表,并实现链表的插入和遍历操作。 首先,我们需要了解链表的...

    Java用数组和链表的方式简单实现HashMap的增删改功能 数组和链表.pdf

    在Java中,HashMap的实现方式有多种,本文将介绍使用数组和链表的方式简单实现HashMap的增删改功能。 HashMap的数据结构 HashMap的数据结构主要由三个部分组成:数组、链表和红黑树。数组用于存储键值对,链表用于...

    Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树) 数组和链表.pdf

    Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树) 在Java集合中,HashMap是一个常用的数据结构,它基于Map接口实现,元素以键值对的方式存储,并且允许使用null键和null值。由于key不允许...

    数组与链表深度解析:性能、应用与选择策略

    数组和链表作为两种基础的线性数据结构,在实际编程中有着广泛的应用。本文将深入探讨数组和链表的内部机制、性能特点、适用场景以及它们在现代编程语言中的实现方式。 数组和链表各有优势和局限,它们在不同的应用...

    c语言链表数组-c语言手写单链表实现,数组和链表结构对比小结和个人理解 数组和链表.pdf

    今天,我们将深入探讨C语言中链表数组的实现和数组与链表结构的对比,并结合个人理解和实践经验来分析它们的优缺。 一、链表数组的实现 链表是一种常见的数据结构,它由多个节点组成,每个节点包含数据域和指针域...

    数组和链表实现队列

    本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...

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

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

Global site tag (gtag.js) - Google Analytics