JAVA(手寫)簡單實現ArrayList和LinkedList
你們都知道在java學習中list類的實現類中有ArrayList 和LinkedList,其中ArrayList是使用數組實現,而LinkedList則是用鏈表實現的。今天就本身去用java去簡單實現一下它們。java
1.ArrayList的實現
1.類必須的屬性
一個object的數組
list的長度
2.基本代碼node
`public class MyArrayList { private Object[] objs;//一個object數組 private int size;//大小 public MyArrayList() { this(10);//初始大小爲10 } public MyArrayList(int initCapacity) { objs=new Object[initCapacity]; } public void add(Object object) { //size是否小於obj的長度 if(size<objs.length) { objs[size]=object; size++; } else{ Object[] bObjects=new Object[size*2]; for(int i=0;i<objs.length;i++) { bObjects[i]=objs[i]; } objs=bObjects; objs[size]=object; size++; } } public static void main(String[] args) { MyArrayList list=new MyArrayList(2); List ls=new ArrayList<Integer>(); ls.add(1); list.add("aaaa"); list.add("bb"); list.add("cccc"); list.add("sadasda"); System.out.println(list.size); } }
2.LinkedList的實現
1.建立node類數組
package com.list.test; public class Node { Node pre;//上一個節點 Object obj;//當前數據 Node next;//下一個節點 public Node(Node pre, Object obj, Node next) { super(); this.pre = pre; this.obj = obj; this.next = next; } public Node() { } public Node getPre() { return pre; } public void setPre(Node pre) { this.pre = pre; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
2.實現LinkedList類markdown
package com.list.test; import org.omg.IOP.CodecPackage.InvalidTypeForEncodingHelper; public class MyLinkedList { private Node first; private Node last; private int size; public void add(Object o) { Node n=new Node(); if(first==null) { n.setPre(null); n.setObj(o); n.setNext(null); first=last=n; } else { n.setPre(last); n.setObj(o); n.setNext(null); last.setNext(n); last=n; } size++; } public Object get(int index) { rangeCheck(index); Node temp=first; if(first!=null) { for(int i=0;i<index;i++) { temp=temp.next; } } return temp.obj; } public void rangeCheck(int index) { if(index<0||index>=size) { try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /*** * 在索引位置添加值 * @param index * @param obj */ public void add(int index,Object obj) { //根據索引查出節點 Node temp=findNode(index); //建立新的節點,並賦值 Node newNode=new Node(); newNode.obj=obj; if(temp!=null) { //找出當前索引的前一個節點 Node up=temp.pre; //將前一個節點的下一個節點賦值爲新節點 up.next=newNode; //將新節點的前一個節點賦值爲up節點 newNode.pre=up; //將新節點的下一個節點賦值temp節點 newNode.next=temp; //將temp節點的前一個節點賦值爲新節點 temp.pre=newNode; size++; } } /** * 按照索引查找節點 * @param index * @return */ private Node findNode(int index) { Node temp=first; if(first!=null) { for(int i=0;i<index;i++) { temp=temp.next; } } return temp; } /** * 按索引刪除數據 * @param index */ public void remove(int index) { rangeCheck(index); Node temp=findNode(index); if(temp!=null) { Node up=temp.pre; Node down=temp.next; up.next=down; down.pre=up; size--; } } public int size() { return size; } public static void main(String[] args) { MyLinkedList list=new MyLinkedList(); list.add("aaa"); list.add("bbbb"); list.add("ccccc"); list.add(1,"acassc"); System.out.println(list.size()); System.out.println(list.get(1)); } }