Java数据结构(一)
——线性表
线性表(亦作顺序表)是最基本、最简单、也是最常用的一种数据结构。线性表的主要特点是,可以在任意位置插入一个数据元素或删除一个数据元素。线性表可以用顺序存储结构或链式存储结构实现,使用顺序存储结构实现的线性表称为顺序表,而使用链式存储结构实现的称为链表,链表主要有单链表,循环单链表,双向链表等。在本篇博客中主要介绍实现的是顺序表与单链表两种。
顺序表
package pzw.List; /** * 利用线性表接口实现顺序表类 * @author PZW * */ public class SeqList implements List{ //设置默认构造的顺序表长度 final int defaultSize = 10; int maxSize; int size; Object[] listArray; //无参构造函数 public SeqList(){ initiate(defaultSize); } //构造函数 public SeqList(int size){ initiate(size); } //初始化顺序表 private void initiate(int sz){ maxSize = sz; size = 0; listArray = new Object[sz]; } public void insert(int i, Object elm) throws Exception { if(size == maxSize){ throw new Exception("顺序表已满无法插入"); } if(i < 0||i > size){ throw new Exception("输入的插入位置错误"); } for(int j = size;j > i;j--){ listArray[j] = listArray[j-1]; } listArray[i] = elm; size++; } public void append(Object elm) throws Exception{ insert(size,elm); } @Override public Object delete(int i) throws Exception { if(size == 0){ throw new Exception("顺序表已空无法删除"); } if(i < 0||i > size){ throw new Exception("输入的删除位置错误"); } Object elm = listArray[i]; for(int j = i;j < size -1;j++){ listArray[j] = listArray[j+1]; } size--; return elm; } public Object getData(int i) throws Exception { if(i < 0||i > size){ throw new Exception("参数错误"); } return listArray[i]; } public void print(){ for(int i = 0;i < size;i++){ System.out.print(listArray[i]+" "); } System.out.println(); } @Override public int size() { // TODO Auto-generated method stub return size; } @Override public boolean isEmpty() { // TODO Auto-generated method stub return size == 0; } /** * * @param sl * @param elm * @return * @throws Exception */ public int MoreDataDelete(SeqList sl,Object elm) throws Exception{ int i,j; int tag = 0; for(i = 0;i < sl.size;i++){ if(elm.equals(sl.getData(i))){ sl.delete(i); i--; tag = 1; } } return tag; } }
顺序表的主要优点是:支持随机读取,以及内存空间利用效率高;
顺序表的主要缺点是:需要预先给出数组的最大数据元素个数,但数组的最大数据元素个数很难准确给出。另外,插入和删除操作每次都必须要遍历数组,即使是在平均情况下,插入和删除操作的时间代价也是O(n)。
单链表
package pzw.list; /** *自定义链表一共由两个类组成 *链表类的方法、属性 * @author pzw * */ public class JList { //定义一个头指针 private JListNode head = null; //创建一个新的节点 JListNode flag=new JListNode(); //记录链表中元素的个数 private int nCount = 0; //插入方法(默认插在最后) public void add(JListNode node){ add(node,nCount); } //插入方法(从nPos位置插入) public void add(JListNode node,int nPos){ //判断位置是否输入正确 if(nPos<0||nPos>nCount){ System.out.println("插入的位置错误"); return; } //如果链表为空,将头节点指向node if(nCount==0){ head=node; nCount++; return; } //其他情况 //创建一个新的节点来指向head flag=head; //找到要插入的点的上一个节点 for(int i=0;i<nPos-1;i++){ //将flag指向flag的下一个节点 flag=flag.Next; } //将插入的元素与其他元素链接起来 node.Next=flag.Next; flag.Next=node; nCount++; } //删除一个元素(链表默认从头删除) public JListNode delete(){ return delete(0); } //删除一个元素(将元素从指定的nPos位置删除) public JListNode delete(int nPos){ //如果链表为空 if(nCount==0){ System.out.println("该链表为空"); return null; } //如果链表中只有一个元素 if(nCount==1){ flag=head; head=null; nCount=0; return flag; } //判断输入的位置是否正确 if(nPos<0||nPos>nCount-1){ System.out.println("删除的位置错误"); return null; } //如果nPos为零 if(nPos==0){ flag=head; head=head.Next; flag.Next=null; nCount--; return flag; } //其他情况 flag=head; //找到要删除位置的元素的前一个 for(int i=0;i<nPos-1;i++){ flag=flag.Next; } //记录flag的下一个节点 JListNode temp=flag.Next; flag.Next=temp.Next; temp.Next=null; nCount--; return temp; } //删除链表中所有元素 public void remove(){ for(int i=0;i<nCount-1;i++){ this.delete(); } } //得到指定位置nPos的元素的值(返回一个节点) public JListNode get(int nPos){ flag=head; //找到要输出的那个节点 for(int i=0;i<nPos;i++){ flag=flag.Next; } //使用temp复制flag节点,但让temp的Next指向空 JListNode temp=new JListNode(); //temp=flag; temp.nValue=flag.nValue; temp.Next=null; return temp; } //获取链表中一共有多少个元素 public int size(){ return nCount; } }
单链表的主要优点是不需要预先给出数据元素的最大个数。另外单链表插入和删除工作时不需要移动数据元素。
单链表的主要缺点是每个节点中要有一个指针,因此单链表的空间利用率低于顺序表,另外,单链表不支持随机读取,单链表的读取必须从头结点开始遍历,因此单链表读取数据的时间代价是O(n)。
相关推荐
Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法
JavaJava 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java ...
Java数据结构是计算机科学中的重要课程,主要探讨如何有效地存储和组织数据,以便进行高效的操作。这门课程通常包括数组、链表、栈、队列、树、图、哈希表等多种数据结构,并深入讲解它们的特性、操作方法以及在实际...
"Java常见数据结构面试题(带答案)" 以下是对Java常见数据结构面试题的知识点总结: 栈和队列 * 栈和队列的共同特点是只允许在端点处插入和删除元素。 * 栈通常采用的两种存储结构是线性存储结构和链表存储结构...
Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...
"Java数据结构实例"这个主题,旨在通过具体的代码实例帮助初学者掌握数据结构的基本概念和使用方式,以此来提升编程思维和问题解决能力。在这个压缩包文件中,我们可以预期找到一些用Java实现的数据结构的源代码。 ...
总的来说,这个《Java数据结构全套》压缩包为Java开发者提供了一个系统性的学习路径,从理论到实践,从基础知识到高级技巧,全面覆盖了数据结构的核心内容。通过深入学习和实践,不仅可以提高编程技能,还能为解决...
java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题...
Java数据结构和算法.pdf
java 数据结构总结的思维导图笔记,个人做的非常全,需要的自行下载
根据提供的信息,“Java数据结构和算法中文第二版”这本书主要关注的是数据结构与算法的相关内容。下面将基于这些信息,详细介绍数据结构与算法的核心概念、重要性和应用领域,以及在Java编程环境中如何实现这些概念...
《邓俊辉版Java数据结构源码》是学习数据结构与算法的重要参考资料,它与邓俊辉教授编写的《Java数据结构》教材相配套,旨在帮助读者深入理解数据结构的概念和实现方法。邓俊辉教授的讲解风格清晰易懂,他的源码同样...
在Java编程中,实现数据结构是一项关键技能,因为它直接影响到程序的性能和可维护性。在这个名为“数据结构JAVA实现”的压缩包中,我们可以看到作者提供了三种重要的数据结构——链表、有序二叉树和队列的Java代码...
总的来说,《数据结构(Java版本)》是一本适合程序员入门的教材,通过学习,你可以系统地掌握数据结构和算法,并用Java语言进行实现,为今后的软件开发打下坚实的基础。无论你是准备面试,还是想要提升编程技能,这...
《清华邓俊辉Java数据结构》是一门深入探讨数据结构及其在Java编程语言中实现的课程。这门课程由清华大学的邓俊辉教授主讲,旨在帮助学生掌握数据结构的基本概念,理解它们的工作原理,并能用Java语言进行实际操作。...
在本Java数据结构课程设计项目中,主要涵盖了数组、链表和字符串等基本数据结构的操作。这个项目不仅涉及了理论知识的应用,还实践了GUI(图形用户界面)的设计,使用了Swing库来构建用户交互界面,并利用文件系统...
Java数据结构是编程领域中的重要基础,它涉及如何在计算机中高效地组织和管理数据,以便进行快速查找、插入和删除等操作。本主题主要关注Java语言实现的数据结构及其相关算法,这对于提升程序性能和解决复杂问题至关...
Java数据结构和算法第三十一讲.avi Java数据结构和算法第三十七讲.avi Java数据结构和算法第三十三讲.avi Java数据结构和算法第三十九讲.avi Java数据结构和算法第三十二讲.avi Java数据结构和算法第三十五讲.avi ...
上述内容是对文档中提到的各类知识点的一个详细描述,由于原文档仅提供了部分内容和章节编号,因此未能对所有章节进行完整解读,但上述所提到的内容足以提供一个对“JAVA版数据结构.pdf”文档内容的概览。...
Java 数据结构 Applet演示是利用Java编程语言设计的交互式应用程序,主要目的是通过可视化的方式帮助学习者理解数据结构的基本概念和操作。Applet是Java的一种小型应用程序,可以在Web浏览器中运行,提供了一种便捷...