zoukankan      html  css  js  c++  java
  • 数据结构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

  • 相关阅读:
    Codeforces 1485C Floor and Mod (枚举)
    CodeForces 1195D Submarine in the Rybinsk Sea (算贡献)
    CodeForces 1195C Basketball Exercise (线性DP)
    2021年初寒假训练第24场 B. 庆功会(搜索)
    任务分配(dp)
    开发工具的异常现象
    Telink MESH SDK 如何使用PWM
    Telink BLE MESH PWM波的小结
    [LeetCode] 1586. Binary Search Tree Iterator II
    [LeetCode] 1288. Remove Covered Intervals
  • 原文地址:https://www.cnblogs.com/lzy321/p/10363697.html
Copyright © 2011-2022 走看看