List集合-LinkedList

实现思路:

1.利用双向链表实现。

git上项目路径: https://github.com/0ziyu0/handWriting

代码:

接口

 1 public interface CustomerList<E> {
 2     
 3     public void add(E object);
 4     
 5     public void add(int index, E object);
 6     
 7     public Object get(int index);
 8     
 9     public Object remove(int index);
10     
11     public Boolean remove(E object);
12     
13     public int size();
14 }

实现:

  1 public class CustomerLinkedList<E> implements CustomerList<E> {
  2 
  3     private Node first = null;
  4     private Node last = null;
  5     private int size = 0;
  6 
  7     class Node {
  8         Node prev = null;
  9         Object date = null;
 10         Node next = null;
 11     }
 12 
 13 
 14     @Override
 15     public void add(E object) {
 16 
 17         Node node = new Node();
 18         node.date = object;
 19         if(first == null) {
 20             first = node;
 21         } else {
 22             last.next = node;
 23             node.prev = last;
 24         }
 25         last = node;
 26         size++;
 27 
 28     }
 29 
 30     private Node getNode(int index) {
 31 
 32         checkBorder(index);
 33         Node node = null;
 34         if(first != null) {
 35             node = first;
 36             for(int i = 0; i < index; i++) {
 37                 node = node.next;
 38             }
 39         }
 40 
 41         return node;
 42     }
 43 
 44     private Integer getNode(Object obj) {
 45 
 46         Integer index = 0;
 47         Node node = first;
 48         while(node != null) {
 49             if(node.date.equals(obj)) {
 50                 return index;
 51             }
 52             index++;
 53             node = node.next;
 54         }
 55 
 56         return null;
 57     }
 58 
 59     @Override
 60     public Object get(int index) {
 61 
 62         checkBorder(index);
 63         Node node = null;
 64         if(first != null) {
 65             node = first;
 66             for(int i = 0; i < index; i++) {
 67                 node = node.next;
 68             }
 69         }
 70 
 71         return node.date;
 72     }
 73     
 74     @Override
 75     public void add(int index, E object) {
 76 
 77         Node oldNode = getNode(index);
 78         Node nodeProv = oldNode.prev;
 79 
 80         Node newNode = new Node();
 81         newNode.date = object;
 82         oldNode.prev = newNode;
 83         if(nodeProv == null) {
 84             first = newNode;
 85         } else {
 86             nodeProv.next = newNode;
 87             newNode.prev = nodeProv;
 88         }
 89         newNode.next = oldNode;
 90 
 91         size++;
 92     }
 93 
 94     @Override
 95     public Object remove(int index) {
 96 
 97         checkBorder(index);
 98         Node node = getNode(index);
 99         if (node != null) {
100             Node prevNode = node.prev;
101             Node nextNode = node.next;
102             // 设置上一个节点的next为当前删除节点的next
103             if (prevNode != null) {
104                 prevNode.next = nextNode;
105             } else {//删除的是第一个
106                 first = first.next;
107             }
108             // 判断是否是最后一个节点
109             if (nextNode != null) {
110                 nextNode.prev = prevNode;
111             }
112         }
113         size--;
114         return node.date;
115     }
116 
117     @Override
118     public Boolean remove(E object) {
119         Integer index = getNode(object);
120         if(index != null) {
121             remove(index);
122             return true;
123         } 
124         
125         return false;
126     }
127 
128     @Override
129     public int size() {
130 
131         return size;
132     }
133 
134     public void checkBorder(int index) {
135         if(index >= size || index < 0) {
136             throw new RuntimeException("数组越界...");
137         }
138     }
139 
140 
141 }

测试代码:

 1 public class TestLinkedList {
 2 
 3     @Test
 4     public void testArrayListAdd001() {
 5         
 6         CustomerList<String> list = new CustomerLinkedList<String>();
 7         list.add("test1");
 8         list.add("test2");
 9         list.add("test3");
10         
11         print(list);
12     }
13     
14     @Test
15     public void testArrayListAdd002() {
16         
17         CustomerList<String> list = new CustomerLinkedList<String>();
18         list.add("test1");
19         list.add("test2");
20         list.add("test3");
21         
22         list.add(0, "test0");
23         print(list);
24     }
25     
26     @Test
27     public void testRemove001() {
28         
29         CustomerList<String> list = new CustomerLinkedList<String>();
30         list.add("test1");
31         list.add("test2");
32         list.add("test3");
33         
34         print(list);
35         
36         list.remove(2);
37         print(list);
38         
39     }
40     
41     @Test
42     public void testRemove002() {
43         
44         CustomerList<String> list = new CustomerLinkedList<String>();
45         list.add("test1");
46         list.add("test2");
47         list.add("test3");
48         
49         print(list);
50         
51 //        list.remove("test1");
52         list.remove(0);
53         print(list);
54         
55     }
56     
57     private void print(CustomerList<String> list) {
58         System.out.println("=======");
59         for(int i = 0; i < list.size(); i++) {
60             System.out.println(list.get(i));
61         }
62     }
63     
64 }

运行截图

 

 

posted @ 2019-01-16 21:09  东隅已逝x  Views(159)  Comments(0)    收藏  举报