LinkedList---链表各种方法的实现
1 public class ListExer2 { 2 public static void main(String[] args) { 3 LinkList list = new LinkList(); 4 list.add("a"); 5 list.add("b"); 6 list.add("c"); 7 // list.add(0,"d"); 8 // list.add(1, "e"); 9 // list.remove(0); 10 // list.remove(2); 11 list.remove(1); 12 System.out.println(list); 13 } 14 } 15 16 class LinkList { 17 private int size = 0; // 节点个数 18 private Node first; // 第一个节点 19 private Node last; // 最后一个节点 20 21 public LinkList() { 22 } 23 24 public void add(String str) { 25 // 创建节点存储数据 26 Node node = new Node(null, str, null); 27 28 // 列表此时为空 29 if (size == 0) { 30 // 如果列表为空,则头结点指向新节点 31 this.first = node; 32 } else { 33 // 原来的尾节点的下一位置为新节点 34 this.last.next = node; 35 // 新节点的上一位是原来的尾节点 36 node.prev = this.last; 37 } 38 // 新的节点变成了尾节点 39 this.last = node; 40 size++; 41 } 42 43 public void add(int index, String str) { 44 // 判断下标是否越界 45 if (index > size) 46 throw new IndexOutOfBoundsException("Index:" + index + ", Size:" 47 + size); 48 // 在尾部追加 49 if (index == size) { 50 this.add(str); 51 return; 52 } 53 Node node = new Node(null, str, null); 54 // 插入的头部 55 if (index == 0) { 56 node.next = this.first; 57 this.first.prev = node; 58 this.first = node; 59 } else { 60 61 Node no = this.getNode(index); 62 63 // 原节点的上一个节点的下一位变成新的节点 64 no.prev.next = node; 65 // 新的节点的上一位是原节点的上一位 66 node.prev = no.prev; 67 // 新节点的下一位是原来的节点 68 node.next = no; 69 // 原节点的上一位是新的节点 70 no.prev = node; 71 72 } 73 size++; 74 } 75 76 private Node getNode(int index) { 77 // 获取指定位置的节点 78 Node no = this.first; 79 for (int i = 0; i < index; i++) { 80 no = no.next; 81 } 82 return no; 83 } 84 85 private void out(int index) { 86 // 判断下标越界 87 if (index >= size) 88 throw new IndexOutOfBoundsException("Index:" + index + ", Size:" 89 + size); 90 91 } 92 93 public void remove(int index) { 94 95 this.out(index); 96 // 头部 97 if (index == 0) { 98 this.first = this.first.next; 99 this.first.prev = null; 100 } /* 尾部 */else if (index == size - 1) { 101 this.last = this.last.prev; 102 this.last.next = null; 103 } else { 104 Node node = this.getNode(index); 105 106 // 原节点的上一个节点的下一位变成原节点的下一位 107 node.prev.next = node.next; 108 // 原节点的下一个节点的上一位变成原节点的上一位 109 node.next.prev = node.prev; 110 } 111 size--; 112 } 113 114 public int indexOf(String str) { 115 116 Node node = this.first; 117 for (int i = 0; i < size; i++) { 118 String data = node.data; 119 if (data == str || data != null && data.equals(str)) 120 return i; 121 node = node.next; 122 } 123 124 return -1; 125 126 } 127 128 public String toString() { 129 130 StringBuilder sb = new StringBuilder("["); 131 Node node = this.first; 132 for (int i = 0; i < size; i++) { 133 sb.append(node.data).append(", "); 134 node = node.next; 135 } 136 137 String str = sb.toString(); 138 if (size > 0) 139 str = str.substring(0, str.length() - 2); 140 return str += "]"; 141 } 142 143 // 利用节点存储数据 144 private class Node { 145 Node prev; // 上一个节点 146 String data; // 元素 147 Node next; // 下一个节点 148 public Node(Node prev, String data, Node next) { 149 super(); 150 this.prev = prev; 151 this.data = data; 152 this.next = next; 153 } 154 155 } 156 157 }
作者:ZHIWEI —— 南岭寒
出处:http://www.cnblogs.com/nanlinghan/
本文版权归作者和博客园共有,欢迎转载。