• 数据结构基础--线性表


    文章来源:http://www.cnblogs.com/V1haoge/p/8276472.html

    手动实现的顺序线性表结构,实现了基本的方法,本地简单测试通过,主要用于理解顺序线性表的结构,还实现了简单的数组扩容,有兴趣的朋友可以看看。

      1 package dataStructure;
      2 
      3 import java.io.Serializable;
      4 
      5 /**
      6  * 顺序线性表
      7  *
      8  * @author qe259
      9  */
     10 public class MyArrayList implements Serializable {
     11 
     12     private static final long serialVersionUID = 5162710183439028792L;
     13     private Object[] list;//底层用数组实现
     14     private static final Integer INITLEBGTH = 10;//默认的初始化数组长度
     15     private static final Double INITFACTOR = 0.75;//默认的初始化增长因子
     16     private final Double dilatationFactor = 1.5;//默认的初始化扩容因子
     17     private Double factor;//增长因子
     18     private Integer length;//数组的长度
     19     private Integer nowLength;//当前数组包含元素的长度
     20 
     21     public MyArrayList(){
     22         this(INITLEBGTH);
     23     }
     24 
     25     public MyArrayList(Integer length){
     26         this(length,INITFACTOR);
     27     }
     28 
     29     public MyArrayList(Integer length,Double factor){
     30         this.length = length == null || length == 0 ? INITLEBGTH : length;
     31         this.factor = factor == null || factor > 1 || factor <= 0 ? INITFACTOR : factor;
     32         list = new Object[length];
     33         nowLength = 0;
     34     }
     35 
     36     //数组扩容
     37     private void dilatation(){
     38         Object[] objs = new Object[(int)(length * dilatationFactor)];
     39         for(int i =0,j = 0;i<nowLength;i++,j++){
     40             objs[j] = list[i];
     41         }
     42         list = objs;
     43         length = objs.length;
     44     }
     45 
     46     //添加元素
     47     public void add(Object obj){
     48         if((double)nowLength/length >= factor){
     49             this.dilatation();
     50         }
     51         list[nowLength]=obj;
     52         nowLength++;
     53     }
     54 
     55     //查看元素
     56     public Object get(Integer index){
     57         if(index<0||index>list.length){
     58             throw new NullPointerException();
     59         }
     60         return list[index];
     61     }
     62 
     63     //插入元素
     64     public void insert(Integer index,Object obj){
     65         if((double)nowLength/length >= factor){
     66             this.dilatation();
     67         }
     68         for(int i = nowLength;i>index;i--){
     69             list[i]=list[i-1];
     70         }
     71         list[index]=obj;
     72         nowLength++;
     73     }
     74 
     75     //移除元素
     76     public void remove(Integer index){
     77         if(index<0||index>nowLength-1){
     78             throw new NullPointerException();
     79         }
     80         for(int i = index;i < nowLength-1;){
     81             list[i]=list[++i];
     82         }
     83         list[nowLength-1]=null;
     84         nowLength--;
     85     }
     86 
     87     //移除指定元素
     88     public void remove(Object t){
     89         for(int i= 0;i<nowLength;i++){
     90             if(get(i)==t) {
     91                 remove(i);
     92             }
     93         }
     94     }
     95 
     96     //清空元素
     97     public void clear(){
     98         for(int i = 0;i<nowLength;i++){
     99             list[i] = null;
    100         }
    101         nowLength=0;
    102     }
    103 
    104     //包含元素
    105     public Boolean contains(Object t){
    106         for(int i = 0;i<nowLength;i++){
    107            if(list[i] == t){
    108                return true;
    109            }
    110         }
    111         return false;
    112     }
    113 
    114     @Override
    115     public String toString() {
    116         StringBuffer s = new StringBuffer("MyArrayList[");
    117         for(int i = 0;i<nowLength;i++){
    118             s.append(list[i].toString()).append(i==nowLength-1?"":",");
    119         }
    120         return s.append("]").toString();
    121     }
    122 
    123     public static void main(String[] args) {
    124         MyArrayList list = new MyArrayList();
    125         list.add("1");
    126         list.add("2");
    127         list.add("3");
    128         list.add("4");
    129         list.add("5");
    130         System.out.println(list.toString());
    131         System.out.println(list.contains("3"));
    132         list.add("6");
    133         list.add("2");
    134         list.add("5");
    135         System.out.println(list.toString());
    136         try{
    137             list.remove(10);
    138         }catch(NullPointerException e){
    139             e.printStackTrace();
    140         }
    141         System.out.println(list.toString());
    142         list.remove(2);
    143         System.out.println(list.toString());
    144         list.remove("2");
    145         System.out.println(list.toString());
    146         list.insert(3,"100");
    147         System.out.println(list.toString());
    148         list.clear();
    149         System.out.println(list.toString());
    150         list.add("1");
    151         list.add("2");
    152         list.add("3");
    153         list.add("4");
    154         list.add("5");
    155         list.add("1");
    156         list.add("2");
    157         list.add("3");
    158         list.add("4");
    159         list.add("5");
    160         System.out.println(list.toString());
    161         list.add("100");
    162         list.add("100");
    163         list.insert(0,"10000");
    164         System.out.println(list.toString());
    165     }
    166 }

      顺序线性表,底层以数组来实现,是内存上连续排列的一系列数据,其特点是查询和添加元素比较迅速,但是插入元素和移除元素比较慢,需要遍历数组。

      手动实现链表形式线性表:

      1 package dataStructure;
      2 
      3 import java.io.Serializable;
      4 import java.util.Objects;
      5 
      6 /**
      7  * 链式线性表
      8  *
      9  * @author qe259
     10  */
     11 public class MyLinkedList implements Serializable {
     12 
     13     //节点
     14     private static class Node{
     15         Object data;
     16         Node next;
     17         Node(Object data,Node next){
     18             this.data = data;
     19             this.next = next;
     20         } 
     21     }
     22 
     23     private static final long serialVersionUID = 5162710183435428792L;
     24     private Node start;// = new Node(null,null);
     25     private Node end;// = new Node(null,null);
     26     private Integer length = 0;
     27 
     28     public MyLinkedList(){
     29         end = new Node(null,null);
     30         start = new Node(null,end);
     31     }
     32     
     33     //添加元素
     34     public void add(Object data){
     35         if(Objects.isNull(data))
     36             throw new NullPointerException();
     37         Node transitNode = end;
     38         end = new Node(data,null);
     39         transitNode.next = end;
     40         if(length==0){
     41             start.next=end;
     42         }
     43         length++;
     44     }
     45     
     46     //查找指定下标元素
     47     public Object get(Integer index){
     48         if(index<1||index>length)
     49             throw new NullPointerException();
     50         Integer count = 0;
     51         Node circleNode = start;
     52         while(circleNode.next != null){
     53             circleNode = circleNode.next;
     54             count++;
     55             if(count == index){
     56                 return circleNode.data;
     57             }
     58         }
     59         return null;
     60     }
     61     
     62     //包含元素
     63     public boolean contains(Object data){
     64         boolean isExists = false;
     65         Node circleNode = start;
     66         while(circleNode.next != null){
     67             circleNode = circleNode.next;
     68             if(circleNode.data == data || circleNode.data.equals(data)){
     69                  isExists = true;
     70             }
     71         }
     72         return false;
     73     }
     74     
     75     //插入元素
     76     public void insert(Integer index,Object... objects){
     77         if(index <= 0 || index > length)
     78             throw new NullPointerException();
     79         Node circleNode = start;
     80         Integer count = 0;
     81         while(circleNode.next != null){
     82             if(count==index-1){
     83                 Node transitNode = circleNode.next;
     84                 Node oNode = new Node(objects[0],null);
     85                 circleNode.next = oNode;
     86                 if(objects.length==1){
     87                     oNode.next = transitNode;
     88                 }
     89                 length++;
     90                 for(int i = 1;i<objects.length;i++){
     91                     if(i==objects.length-1){
     92                         oNode.next = new Node(objects[i],transitNode);
     93                     }else{
     94                         Node transitNode1 = new Node(objects[i],null);
     95                         oNode.next = transitNode1;
     96                         oNode = transitNode1;
     97                     }
     98                     length++;
     99                 }
    100                 break;
    101             }
    102             count++;
    103             circleNode = circleNode.next;
    104         }
    105     }
    106     
    107     //移除指定下标元素
    108     public void remove(Integer index){
    109         Node circleNode = start;
    110         Integer count = 0;
    111         if(index == length){
    112             while(circleNode.next !=null){
    113                 count++;
    114                 circleNode = circleNode.next;
    115                 if(count==length-1)break;
    116             }
    117             circleNode.next=null;
    118             end = circleNode;
    119             length--;
    120             return;
    121         }
    122         while(circleNode.next != null){
    123             count++;
    124             circleNode = circleNode.next;
    125             if(count==index-1){
    126                 circleNode.next = circleNode.next.next;
    127                 length--;
    128                 break;
    129             }
    130         }
    131     }
    132 
    133     //清空列表
    134     public void clear(){
    135         Node circleNode = start;
    136         while(circleNode.next != null){
    137             Node transitNode = circleNode.next;
    138             circleNode.next = null;
    139             circleNode = transitNode;
    140             circleNode.data = null;
    141         }
    142         length = 0;
    143         end = new Node(null,null);
    144         start = new Node(null,end);
    145     }
    146 
    147     @Override
    148     public String toString() {
    149         Node circleNode = start;
    150         StringBuffer str = new StringBuffer("MyLinkedList[");
    151         Integer count = 0;
    152         while(circleNode.next != null){
    153             count++;
    154             circleNode=circleNode.next;
    155             if(count == length){
    156                 str.append(circleNode.data.toString()).append("]");
    157             }else{
    158                 str.append(circleNode.data.toString()).append(",");
    159             }
    160         }
    161         return str.toString();
    162     }
    163 
    164     public static void main(String[] args) {
    165         // TODO Auto-generated method stub
    166         MyLinkedList list = new MyLinkedList();
    167         list.add("1");
    168         list.insert(1,"111");
    169         list.add("2");
    170         Object o = list.get(2);
    171         list.add("3");
    172         list.add("4");
    173         list.add("5");
    174         list.insert(3, "100","200","300");
    175         list.add("13321");
    176         list.remove(9);
    177         list.remove(4);
    178         list.add("asd");
    179         list.remove(9);
    180         System.out.println(list);
    181         list.clear();
    182     }
    183 
    184 }

      下面是静态链表,采用数组方式实现,适用于无指针和类似指针功能语言来实现:

      1 package dataStructure;
      2 
      3 import java.io.Serializable;
      4 
      5 public class MyStaticLinkedList implements Serializable {
      6 
      7     private static final long serialVersionUID = 5143210183435428792L;
      8 
      9     //节点
     10     public static class Node{
     11         Object data;
     12         Integer next;
     13         Node(Object data,Integer next){
     14             this.data=data;
     15             this.next=next;
     16         }
     17     }
     18 
     19     private static Node[] staticList;
     20     private static final Integer ListLength = 1000;
     21     private Integer length = 0;//链表长度
     22     private Integer useMaxLength = 0;//這個值表示的是數組被占用過的最大下標值
     23 
     24     //无参构造器
     25     public MyStaticLinkedList(){
     26         this(ListLength);
     27     }
     28 
     29     //构造器
     30     public MyStaticLinkedList(Integer length){
     31         staticList = new Node[length];
     32         for(int i = 0;i<length;i++){
     33             staticList[i] = new Node(null,i+1);
     34         }
     35         staticList[length-1].next = 0;
     36     }
     37 
     38     //添加元素
     39     public void add(Object data){
     40         staticList[staticList[0].next].data = data;
     41         if(useMaxLength == length){
     42             staticList[0].next=++staticList[0].next;
     43             if(length == 0){
     44                 staticList[staticList.length-1].next = 1;
     45             }
     46             if(staticList[0].next>useMaxLength)
     47                 useMaxLength++;
     48         }else if(useMaxLength > length){//數組存在空位,即數組刪除過其中的元素
     49             for(int i = 1;i<=useMaxLength;i++){
     50                 if(staticList[i].data==null){
     51                     staticList[staticList[0].next].next=i;
     52                     staticList[0].next=i;
     53                     break;
     54                 }
     55             }
     56         }else
     57             throw new IllegalAccessError();
     58         length++;
     59     }
     60 
     61     //包含元素
     62     public Boolean contains(Object data){
     63         Boolean isExists = false;
     64         for(int i = 1;i<=useMaxLength;i++){//此處使用useMaxLength有取巧之嫌,本應循環鏈表,而非數組,所以此處查詢到的不一定是鏈表中保存的首個該數據
     65             if(staticList[i].data==data||staticList[i].data.equals(data)){
     66                 isExists = true;
     67                 break;
     68             }
     69         }
     70         return isExists;
     71     }
     72 
     73     /**
     74      * 插入元素
     75      */
     76     public void insert(Integer index,Object data){
     77         if(index<=0||index>length)
     78             throw new NullPointerException();
     79         staticList[staticList[0].next].data = data;
     80         Node circleNode = staticList[staticList.length-1];
     81         Integer oIndex = 0;//插入位置原节点
     82         for(int i = 0;i<=length;i++){//循環鏈錶
     83             if(i == index-1){//在首位插入数据,其前节点即为数组最后一位
     84                 oIndex = circleNode.next;
     85                 circleNode.next = staticList[0].next;
     86                 staticList[staticList[0].next].next = oIndex;
     87             }
     88             circleNode = staticList[circleNode.next];
     89         }
     90         if(index == 1){
     91             staticList[staticList.length-1].next = staticList[0].next;
     92         }
     93         if(staticList[0].next>useMaxLength)
     94             useMaxLength++;
     95         //circleNode最后保存的是链表的尾节点这个节点和数组首位的下标一致,指向新的空位节点
     96         for(int i = 1;i < staticList.length;i++){
     97             if(staticList[i].data==null){
     98                 staticList[0].next = i;
     99                 circleNode.next = i;
    100                 break;
    101             }
    102         }
    103         length++;
    104     }
    105 
    106     /**
    107      * 移除指定下标元素
    108      * @param index
    109      */
    110     public void remove(Integer index){
    111         if(index<=0||index>length)
    112             throw new NullPointerException();
    113         Node circleNode = staticList[staticList.length-1];
    114         Integer oIndex = 0;//删除节点的位置
    115         for(int i = 0;i <= length;i++){
    116             if(i==index-1){
    117                 oIndex = circleNode.next;
    118                 staticList[oIndex].data = null;
    119                 circleNode.next = staticList[oIndex].next;
    120                 Integer ooIndex = 0;
    121                 if(staticList[0].next > oIndex){
    122                     ooIndex = staticList[0].next;
    123                     staticList[0].next = oIndex;
    124                     staticList[oIndex].next = ooIndex;
    125                 }else{
    126                     ooIndex = staticList[staticList[0].next].next;
    127                     if(ooIndex > oIndex){
    128                         staticList[staticList[0].next].next = oIndex;
    129                         staticList[oIndex].next = ooIndex;
    130                     }
    131                 }
    132             }
    133             if(i == length-1){
    134                 circleNode.next = staticList[0].next;
    135             }
    136             circleNode = staticList[circleNode.next];
    137         }
    138         length--;
    139     }
    140 
    141     public void remove(Object data){
    142 
    143     }
    144 
    145     //清空鏈表
    146     public void clear(){
    147         for(int i = 0;i <= useMaxLength;i++){
    148             staticList[i].data = null;
    149             staticList[i].next = i + 1;
    150             staticList[staticList.length-1].next = 1;
    151         }
    152         useMaxLength = 0;
    153         length = 0;
    154     }
    155 
    156     @Override
    157     public String toString() {
    158         StringBuffer sb = new StringBuffer("MyStaticLinkedList[");
    159         Node circleNode = staticList[staticList.length-1];
    160         for(int i = 0;i<length;i++){
    161             circleNode = staticList[circleNode.next];
    162             sb = i==length-1
    163                     ?sb.append(circleNode.data.toString())
    164                     :sb.append(circleNode.data.toString()).append(",");
    165         }
    166         return sb.append("]").toString();
    167     }
    168 
    169     //测试
    170     public static void main(String[] args){
    171         MyStaticLinkedList list = new MyStaticLinkedList(20);
    172         list.add("1");
    173         list.add("2");
    174         list.add("3");
    175         list.add("4");
    176         list.add("5");
    177         list.add("6");
    178         list.remove(5);
    179         list.remove(1);
    180         list.remove(2);
    181         list.add("7");
    182         System.out.println(list);
    183         list.insert(1,"111");
    184         list.insert(2,"222");
    185         System.out.println(list.contains("333"));
    186         System.out.println(list.contains("3"));
    187         list.add("2");
    188         System.out.println(list);
    189         list.clear();
    190     }
    191 
    192 }

       所有代码均为本人手工编写,功能经过本人简单测试,如有问题,还请指出,本代码旨在通过练习熟悉线性表的几种实现方式,和其中的复杂度。

  • 相关阅读:
    c# 日期函数
    js中的replace问题和textarea回车符问题
    项目代码风格要求
    重温Observer模式--热水器·改
    xcode 编译glfw , 导出.h
    开发者所需要知道的 iOS 11 SDK 新特性
    RAC基础笔记(2)
    RAC基础笔记
    NSString copy,strong 修饰问题
    git 常用操作
  • 原文地址:https://www.cnblogs.com/V1haoge/p/8276472.html
Copyright © 2020-2023  润新知