数据结构基础--线性表
文章来源: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 }
所有代码均为本人手工编写,功能经过本人简单测试,如有问题,还请指出,本代码旨在通过练习熟悉线性表的几种实现方式,和其中的复杂度。