手动实现LinkedList

1.首先实现一个node类

 1 package text;
 2 
 3 
 4 //用来表示一个节点
 5 public class Node{
 6      Node previous;//注意类型
 7      Object obj;
 8      Node next;
 9     
10     public Node(){
11         
12     }
13     public Node(Node previous,Object obj,Node next){//构造方法
14         super();
15         this.previous = previous;
16         this.obj=obj;
17         this.next= next;
18         
19     }
20     public Object getPrevious(){
21         return previous;
22     }
23     public void setPrevious(Node previous){
24         this.previous= previous;
25     }
26     
27     public Object getObj(Object obj){
28         return obj;
29     }
30     public void setObj(Object obj){
31         this.obj=obj;
32     }
33     public Node getNext(){
34         return next;
35     }
36     public void setNext(Node next){
37         this.next=next;
38     }
39     
40 }

2.实现linkedList

  1 package text;
  2 import java.util.LinkedList;
  3 
  4 
  5 public class SxtLinkedList{
  6     private Node first;
  7     private Node last;
  8     private int size;
  9     
 10     public void add(Object obj){
 11         Node n= new Node();
 12         if(first==null){
 13             n.setPrevious(null);
 14             n.setObj(obj);
 15             n.setNext(null);
 16             
 17             first=n;
 18             last=n;
 19         }
 20         else{
 21             //直接往last接待你后增加新的节点
 22             n.setPrevious(last);//设置前面的指向
 23             n.setObj(obj);
 24             n.setNext(null);//设置后面的指向
 25             
 26             last.setNext(n);//将与前面的节点关联
 27             last=n;//设置后一个节点
 28         }
 29         size++;//链表长度加一
 30     }
 31     public int size(){
 32         return size;
 33     }
 34     
 35     private void rangeCheck(int index){//越界函数
 36         if(index<0||index>=size){//size表示长度,真实的下标是长度减一,所以当下标位长度时就已经越界
 37             try{
 38                 throw new Exception();
 39                 
 40             }catch(Exception e){
 41                 e.printStackTrace();
 42             }
 43         }
 44     }
 45     public Object get(int index){
 46         rangeCheck(index);//判断是否越界
 47         
 48         Node temp=node(index);//下面的node方法
 49         if(temp!=null){
 50             return temp.obj;
 51             
 52         }
 53         return null;
 54         
 55     }
 56     
 57 /**
 58  * publi Node node(int index){
 59  *         Node temp=null;
 60  *             if(first!=null){
 61  *                 temp=first;
 62  *              for(int i=0;i<index;i++){
 63  *                  temp=temp.next;
 64  *              }
 65  *             }
 66  * return temp;
 67  * }
 68  * 
 69  * @param index
 70  * @return
 71  */
 72     
 73     public Node node(int index){
 74         Node temp= null;
 75         if(first!=null){
 76             if(index<(size>>1)){
 77                 temp=first;
 78                 for(int i=0;i<index;i++){
 79                     temp=temp.next;
 80                 }
 81             }else{
 82                 temp=last;
 83             for(int i=size-1;i>index;i--){
 84                 temp=temp.previous;
 85             }
 86             }
 87         }
 88         return temp;
 89     }
 90     public void remove(int index){//移除某个节点
 91         Node temp= node(index);
 92         if(temp!=null){
 93             Node up=temp.previous;//上一个节点
 94             Node down=temp.next;//下一个节点
 95             up.next=down;
 96             down.previous=up;
 97             size--;
 98         }
 99     }
100     public void add(int index,Object obj){//插入
101         Node temp=node(index);
102         
103         Node newNode = new Node();
104         newNode.obj=obj;
105         if(temp!=null){
106             Node up=temp.previous;
107             up.next=newNode;
108             newNode.previous=up;
109             
110             newNode.next=temp;
111             temp.previous = newNode;
112             
113             size++;
114         }
115     }
116     
117     public static void main(String[] args){
118         SxtLinkedList list= new SxtLinkedList();
119         list.add("aaa");
120         list.add("bbb");
121         list.add(1,"BBBB");
122         list.add("ccc");
123         list.remove(1);
124         System.out.println(list.get(2));
125     }
126     
127 }

双向链表的插入示意图

 

posted @ 2018-06-01 15:27  不停地走  阅读(342)  评论(0编辑  收藏  举报