`
zlele
  • 浏览: 37464 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

数据结构(数组与链表)

阅读更多
1.数组,优点:查找方便,缺点:增删不方便
  链表,优点:增删方便,缺点:查找不方便
2.数组:一般长度是有限的,为了方便能使用,可以通过新建一个数组,来增加数组的长度,步骤:创建新数组(长度比原数组多一);将元素复制进新数组;添加新元素;新数组指向原数组。自己定义增删改查遍历等功能,数组自带长度属性。

public class List<E> {
	//定义一个新数组
		Object[] src=new Object[0];
		/**
		 * 添加元素
		 * @param s 要添加的元素
		 */
		public void add(E s){
			//定义一个新数组
			Object[] nsrc=new Object[src.length+1];
			//复制数据
			for(int i=0;i<src.length;i++){
				nsrc[i]=src[i];
			}
			//添加新元素
			nsrc[src.length]=s;
			//原数组指向新数组
			src=nsrc;
		}
		/**
		 * 查找
		 * @param index 所查元素的下标
		 * @return 所查元素
		 */
		public E get(int index){
			E s=(E)src[index];
			return s;
		}
		/**
		 * 数组的长度
		 * @return 返回数组的长度
		 */
		public int size(){
			return src.length;
		}
		/**
		 * 按照下标删除
		 * @param index 删除元素的下标
		 */
		public void delete(int i){
			//定义一个新数组
			if(src.length==0){
				System.out.println("sssssssssssss");
			}
			Object[] que1=new Object[src.length-1];
			//把下标为index之前的元素复制到新数组中
				que1[i]=src[i];
			//原数组指向新数组
			src=que1;
		}
}

利用数组可实现相关的重绘
3.链表:节点需自己定义,包括指针和数值(在节点类中定义)
        链表需要考虑的问题:添加时,如果链表为空;添加时链表中只有一个节点;添加位置错误;删除时,链表为空;删除时,链表中只有一个节点;如果要删除头结点;输入位置错误。关于链表的定义如下:

/**
 * 链表
 * @author zll
 *
 */
public class List {
    //定义一个头指针
	private JNode head=null;
	//记录链表中的数据个数
	private int nCount =0;
	/**
	 * 默认在最后插入
	 * @param 所插入的节点
	 */
	public void add(JNode node){
		add(nCount,node);
	}
	/**
	 * 在pos处插入节点
	 * @param pos 插入节点的位置
	 * @param node 插入的节点
	 */
	public void add(int pos,JNode node){
		//如果输入错误
		if(pos<0||pos>nCount){
			System.out.println("输入错误,请重新输入");
			return ;
		}
		//如果链表为空
		if(nCount==0){
			head=node;
			nCount++;
			return ;
			}
		JNode temp=head;
		//temp表示pos前一个位置的节点
		for(int i=0;i<pos-1;i++){
			temp=temp.Next;
			}
		node.Next=temp.Next;
	    temp.Next=node;
	    nCount++;
        }
	/**
	 * 链表长度
	 * @return 链表长度
	 */
	public int size(){
		return nCount;
	}
	/**
	 * 得到数据
	 * @param i 得到第i个数据
	 * @return   返回数据
	 */
	public JNode get(int i){
		if(nCount==0){
			System.out.println("链表中没有数据,请先输入数据");
			return null;
		}
		if(i<0||i>nCount){
			System.out.println("输入错误");
			return null;
		}
		//如果只有一个数据
		if(nCount==1){
			JNode temp=head;
			temp.nValue=head.nValue;
			temp.Next=null;
			return temp;
			
		}
		else{
        JNode fence=head;
		for(int j=0;j<i;j++){
			fence=fence.Next;
			}
		JNode temp=new JNode();
		temp.nValue=fence.nValue;
		temp.Next=null;
		System.out.println("temp.nValue"+temp.nValue);
	    return temp;
		}
	}
/**
 * 默认移除最后一个
 */
	public void removed(){
	remove(nCount-1);
}
	/**
 *  移除特定位置的元素
 * @param i 移除元素的位置
 * @return 返回移除元素
 */
public JNode remove(int nPos){
	//如果输入的数字过大或过小
	if(nPos<0||nPos>nCount-1){
			System.out.println("输入错误,请重新输入");
			return null;
	}
	//如果链表中没有元素
	if(nCount==0){
		System.out.println("链表中没有元素,请输入元素");
		return null;
	}
	//如果链表中只有一个元素
	if(nCount ==1){
		head=null;
		JNode node=head;
		nCount=0;
		return node;
	}
	//如果要删除头结点
	if(nPos==0){
		JNode temp=head.Next;
		head.Next=null;
		JNode tmp=head;
		head=temp;
		return tmp;
	}
	//其他情况
	JNode temp=head;
	for(int i=0;i<nPos-1;i++){
		temp=temp.Next;
	}
	JNode tmp=temp.Next;
	temp.Next=temp.Next.Next;
	return tmp;
 }
}

关于节点的定义:
public class JNode {
public JNode Next;
public int nValue;
}

4.链表进化---二叉树
  每个节点有两个next:左指针,右指针
  插入时,进行判断小于父亲节点,往左走,大于往右走;到达叶节点时,插入。
public class TreeNode {
public TreeNode leftchild;
public TreeNode rightchild;
public int nValue;
}

/**
 * 创造树的相关方法
 * @author zll
 *
 */
public class CreatTree {
	private int y=0;
public  TreeNode root;
/**
 * 添加nValue
 * @param nValue 添加的数
 */
public void add(int nValue){
	//新建一个树节点,使其值为nValue
	TreeNode temp=new TreeNode();
	temp.nValue=nValue;
	//如果树为空,新增加的树节点为根
	if(root==null){
		root=temp;
		return ;
	}
	//如果不为空,则从根节点往下寻找加入点
	add(root,temp);
}
/**
 * 新增节点
 * @param head  从head开始往下遍历
 * @param temp  新增节点
 */
public void add(TreeNode head,TreeNode temp){
	//如果数值小于head节点,就放在左孩子上
	if(temp.nValue<head.nValue){
		//如有左孩子,继续遍历
		if(head.leftchild!=null)
			add(head.leftchild,temp);
		  //如果没有左孩子,加在左孩子上
		else
			head.leftchild=temp;
	}
	//如果数值大于head节点,就放在右孩子上
	if(temp.nValue>=head.nValue)  {
		  //如果有右孩子,继续遍历
		if(head.rightchild!=null)
			add(head.rightchild,temp);
		  //如果没有右孩子,加在右孩子上
		else
			head.rightchild=temp;
	}
}
//先序遍历
	public void xian(TreeNode head1){
		if(head1!=null){
			System.out.println(head1.nValue);
			xian(head1.leftchild);
	
			xian(head1.rightchild);
		}
	return;
	}
}
  • 大小: 15.7 KB
  • 大小: 3.4 KB
分享到:
评论

相关推荐

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

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

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

    Python列表是一个非常常用的数据结构,但是它究竟是数组还是链表实现的?在Python中,列表是使用链表结构实现的,但是在某些情况下,也可以使用数组结构来实现。那么,为什么Python列表要使用链表结构,而不使用数组...

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

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

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

    随机访问是指可以直接访问数组或链表中的任何元素,而不需要遍历整个数据结构。例如,vector 中可以使用迭代器 i = v.begin() + N,得到第 N+1 个元素的迭代器,可以直接跳到要访问的位置。而链表则不是随机访问,想...

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

    Python算法中,数组和链表是两种常用的数据结构。它们都是用于存储和管理数据的,但是它们在实现和使用上有很大的区别。 数组是具有相同的数据类型且按一定次序排列的集合体。它的元素在内存中的地址是连续相邻的...

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

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

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

    本篇文章主要探讨的是两种基本的数据结构——数组与链表。通过对比它们的特点、优缺点以及适用场景,帮助读者更好地理解何时选择哪种数据结构更为合适。 #### 数组与链表概述 **数组**是一种常见的数据结构,它是...

    [数据结构]数组与链表的优缺点和区别 数组和链表.pdf

    数组和链表是两种基本的数据结构,它们各自有其独特的优缺点,适用于不同的场景。下面将详细介绍这两种数据结构以及它们的区别。 首先,数组是一种线性数据结构,它将元素在内存中连续存放,每个元素占用相同的内存...

    数据结构:数组和链表的区别以及各自的优缺点 数组和链表.pdf

    "数据结构:数组和链表的区别以及各自的优缺点" 数据结构是计算机科学中研究的基本概念之一,数组和链表是两种最基本的数据结构形式。它们在计算机科学和其他相关领域中发挥着重要的作用。 数组是将元素在内存中...

    数组与链表不同

    数组和链表是两种基本的数据结构,它们在内存管理和数据操作上有着显著的不同,这些差异影响了它们在特定场景下的效率和适用性。 数组是一种线性的数据结构,它在内存中占据连续的空间。这意味着所有元素的地址是...

    数据结构基础-数组、链表语法基础复习.pdf

    数组和链表是数据结构中最基础的两种数据组织方式,它们在计算机科学和软件工程领域中具有广泛的应用。数组是一种线性数据结构,它由相同类型的元素组成,这些元素通过数组元素的下标进行访问和操作。链表则是一种非...

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

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

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

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

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

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

    数组、链表、队列、栈数据结构特点,各自优点和缺点 数组和链表.pdf

    数组、链表、队列、栈数据结构特点,各自优点和缺点 在计算机科学中,数据结构是指用于组织和存储数据的方式。常见的数据结构包括数组、链表、队列、栈等。每种数据结构都有其特点、优点和缺点,本文将对这些数据...

    数组与链表的区别

    在计算机科学中,数组与链表是最基础也是最重要的两种数据结构。它们各自拥有独特的特点和应用场景,掌握这两种数据结构的区别对于理解和解决实际问题至关重要。 #### 二、基于空间的考虑 **1. 数组** 数组是一种...

    数据结构(数组和链表) 数组和链表.pdf

    数组和链表是两种最基本且常用的数据结构,各自有着独特的特性和应用场景。 数组是一种线性数据结构,它在内存中占据一块连续的空间。数组的大小在创建时即被固定,无法动态扩展或收缩。数组的每个元素占用相同大小...

    C++——数组模拟链表

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

    数据结构顺序表、链表和数组是逻辑结构还是物理(存储)结构? 数组和链表.pdf

    数据结构顺序表、链表和数组是逻辑结构还是物理(存储)结构? 数据结构是计算机科学中的一门重要学科,它研究的是计算机中数据的组织、存储和处理方式。数据结构可以分为逻辑结构和物理结构两种。 逻辑结构是指...

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

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

Global site tag (gtag.js) - Google Analytics