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 }
运行截图






浙公网安备 33010602011771号