• 数据结构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/10371767.html

  • 相关阅读:
    第三章 AOP
    第二章 IoC
    第一章 Spring 概述
    框架整合
    后台管理工程搭建
    技术架构
    淘淘商城简介
    电商行业背景
    前言
    FutureTask的使用
  • 原文地址:https://www.cnblogs.com/lzy321/p/10363697.html
Copyright © 2020-2023  润新知