数据结构java(一)数组链表

链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储。

相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存。

所以只需要创建一个对象数组,为了能让链表更加实用,方便存储非基本类型的对象,所以使用了泛型。

菱形运算符<>中放你自己写的或者基本类型,比如你创建了一个Stdent类,想用链表将很多学生的信息存起来。

就可以myArrayList<Student> a=new myArrayList();这个链表就都存Student类的对象了。

数组链表的源码:

  1 import java.util.Arrays;
  2
  3 /**
  4  * @author 李正阳
  5  * @param <E> 泛型:所存储的对象
  6  */
  7 public class myArrayList<E> implements List<E> {
  8     /**
  9      * DEFAULT_SIZE 数组链表储存的最大值
 10      * elementData 存储元素的数组
 11      * capacity当前数组链表可以存储的个数(为了扩容存在)
 12      * size当前链表存储的个数
 13      */
 14     private final int DEFAULT_SIZE = 16;
 15     private Object[] elementData;
 16     private int capacity;
 17     public int size;
 18
 19     /**
 20      * 初始化数组栈
 21      */
 22     public myArrayList() {
 23         elementData = new Object[DEFAULT_SIZE];
 24         size = 0;
 25         capacity=DEFAULT_SIZE;
 26     }
 27
 28     /**
 29      * 在数组链表的最后添加元素
 30      * @param data 添加的元素
 31      * @return true 添加成功 false 添加失败
 32      */
 33     @Override
 34     public boolean add(E data) {
 35         if(isFull()) {
 36             relloc();
 37             elementData[size] = data;
 38             size++;
 39         }else {
 40             elementData[size] = data;
 41             size++;
 42         }
 43         return true;
 44     }
 45
 46     /**
 47      * 判满函数
 48      * @return true 满 false 未满
 49      */
 50     @Override
 51     public boolean isFull() {
 52         if (size == DEFAULT_SIZE-1) {
 53             return true;
 54         } else {
 55             return false;
 56         }
 57     }
 58     /**
 59      * 判空函数
 60      * @return true 空 false 未空
 61      */
 62     @Override
 63     public boolean isEmpty() {
 64         if (size ==0) {
 65             return true;
 66         } else {
 67             return false;
 68         }
 69     }
 70
 71     /**
 72      * 删除元素
 73      * @param number 删除元素在数组中的位置
 74      * @return
 75      */
 76     @Override
 77     public E remove(int number){
 78
 79             E temp;
 80             if (number == size) {
 81                 temp = (E) elementData[size - 1];
 82                 size--;
 83             } else if(number<size) {
 84                 temp = (E) elementData[number - 1];
 85                 for (int i = number; i < size; i++) {
 86                     elementData[i] = elementData[i + 1];
 87                 }
 88                 size--;
 89             }else {
 90                 throw new ArrayIndexOutOfBoundsException();
 91             }
 92             return temp;
 93
 94     }
 95
 96     /**
 97      * 删除数组最后的元素
 98      * @return 删除那个元素
 99      */
100     @Override
101     public E remove(){
102         E temp;
103         temp = (E) elementData[size-1];
104         size--;
105         return temp;
106     }
107
108     /**
109      * 设置某一个位置元素
110      * @param i 在数组的位置
111      * @param data 替换的元素
112      */
113     @Override
114     public void set(int i,E data){
115         if(i<=size) {
116             elementData[i - 1] = data;
117         }else {
118             throw new ArrayIndexOutOfBoundsException();
119         }
120     }
121
122     /**
123      * 取得数组中某个位置的元素
124      * @param i 数组的位置
125      * @return 这个位置的对象
126      */
127     @Override
128     public E get(int i){
129         E temp;
130         if(i<=size) {
131              temp = (E) elementData[i - 1];
132             return temp;
133         }else {
134             throw new ArrayIndexOutOfBoundsException();
135         }
136     }
137
138     /**
139      * 判断一条链表是否为回文
140      * @return false 否 true 是
141      */
142     @Override
143     public boolean isPalindrome() {
144         if(!isEmpty()) {
145             for (int i = 0, j = size - 1; i < size - 1; i++, j--) {
146                 if (String.valueOf(elementData[i]).equals(String.valueOf(elementData[j]))) {
147                 } else {
148                     return false;
149                 }
150             }
151             return true;
152         }else {
153            throw new NullPointerException();
154         }
155     }
156
157     /**
158      * 输出链表中所有元素
159      */
160     @Override
161     public void traver() {
162         for (int i=0;i<size;i++){
163             System.out.print(elementData[i]+" ");
164         }
165     }
166
167     /**
168      * 扩容将数组扩容为两倍
169      */
170     private void relloc(){
171         capacity=DEFAULT_SIZE*2;
172         elementData=Arrays.copyOf(elementData,DEFAULT_SIZE*2);
173     }
174 }

List接口:

 1 /**
 2  * @author 李正阳
 3  * @param <E> 泛型
 4  */
 5 public interface List<E> {
 6     public boolean add(E data) ;
 7
 8     /**
 9      * 链式不需要这个方法
10      */
11     default boolean isFull() {
12         return false;
13     }
14     public boolean isEmpty() ;
15     public E remove(int number);
16     public E remove();
17     public void set(int i,E data);
18     public E get(int i);
19     public boolean isPalindrome();
20     public void traver();
21 }

原文地址:https://www.cnblogs.com/lzy321/p/10363697.html

时间: 2024-10-02 21:26:41

数据结构java(一)数组链表的相关文章

数据结构——Java实现单向链表

结点类: 1 /** 2 * @author zhengbinMac 3 * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. 4 */ 5 public class OnelinkNode { 6 // 保存结点的值 7 public int data; 8 // 保存后继结点的引用 9 public OnelinkNode next; 10 // 构造值为k的结点 11 public OnelinkNode(int

数据结构Java实现——④数组—&gt;稀疏矩阵三元组顺序存储--&gt;矩阵的倒置

作者信息 文字描述 倒置:把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵,记作AT或A. 通常矩阵的第一列作为转置矩阵的第一行,第一行作为转置矩阵的第一列. 那么,在已经存储好的三元组的顺序存储结构中,如果如何实现矩阵的倒置呢??? 第一反应肯定是直接遍历,然后行列对换即可,但是因为要求按照行号优先(也可以是列号优先,但是必须倒置前和倒置后都按照一种优先的方式排列),所以如果直接对换,那么就会变得没有顺序,还需要一次排序,这样反而不妙. 1.正常倒置 既然要进行行列对换,那么对换后的行号

数据结构Java实现——④数组——&gt;稀疏矩阵三元组顺序存储

作者信息 写在前面 闲话不想多说,接着总结,今天说的是稀疏矩阵三元组存储的顺序结构. 文字描述 一.名词解释 1.稀疏矩阵 矩阵阵中非零元素较少且分布的没有规律 2.三元组存储 矩阵中的一个元素有三个属性:行号,列号,元素的值,成为三元组 3.顺序结构 对于每一个三元组而已,根据行号优先或者列号优先排序起来,便于后期针对矩阵的运算 二.压缩与还原 1.压缩 逐行扫描矩阵,遇见非零元素就记录下来即可 2.还原 遍历顺序存储的数据,将每一个数据放入到矩阵的合适位置即可 代码实现 1.三元组抽象结构

数据结构Java实现04----循环链表、仿真链表

数据结构Java实现04----循环链表.仿真链表 单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的长处是从链尾到链头比较方便.当要处理的数据元素序列具有环型结构特点时,适合于采用循环单链表. 和单链表相同,循环单链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除操作时,算法实现较为

数据结构Java实现03----单向链表的插入和删除

数据结构Java实现03----单向链表的插入和删除 文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构:            概念: 链式存储结构是基于指针实现的.我们把一个数据元素和一个指针称为结点.   数据域:存数数据元素信息的域. 指针域:存储直接后继位置的域. 链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来.链式存储结构的线性表称为链表. 链表类型: 根据链表的构造方式的不同可以分为: 单向链表 单向循环链表 双向循环链表 二

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

java的数组和链表

数组和链表 java的数组是什么:数组是用来存放同一种数据类型的集合, 数组中每个元素都是相通的数据类型,数组就是在内存中划分一串连续的空间(数组作为对象允许使用new关键字进行内存分配),注意只能存放同一种数据类型(Object类型数组除外),数组是一种数据结构 举个栗子:string:就是char类型的数组. 为什么要学数组:因为数组可以存放许多相同的数据类型!!编写程序时省去了很多代码量!! 怎么使用数组: 第一种方式: 数据类型 []  数组名称 = new 数据类型[数组长度]; 这里

自己动手实现java数据结构(二) 链表

1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是,链表内部存储数据的方式却和向量大不相同:链表的核心是节点.节点存储"数据"的同时还维护着"关联节点的引用".要理解链表,首先必须理解链表的内部节点结构. 最简单的链表结构是单向链表,单向链表中的内部节点存储着数据(data)和其关联的下一个节点的引用(next). da

Java算法入门-数组&amp;链表&amp;队列

算法就是解决问题的步骤,在一般的项目中可能用不上,但是一旦涉及到高并发,高性能时,就不得不考虑算法的优劣. 设计原则和特性 设计原则:正确性,可读性,健壮性,高效率和低存储 特性:有穷性,确定性,可行性,有输入,有输出. 算法题入门体验 如何判断是一个数是2的整数次幂?常规方法使用循环,但是在学习了二进制的基础知识后,发现可以使用模运算来实现. 1 import java.util.Scanner; 2 3 public class base { 4 5 public static void m