1 public class LinkedList>{2 //链表节点内部类
3 private classNode{4 E e;5 Node next;6 publicNode(E _e,Node _next){7 this.e =_e;8 this.next =_next;9 }10 publicNode(E _e){11 this(_e, null);12 }13 publicNode(){14 this(null, null);15 }16 }17 //头节点
18 privateNode head;19 //链表实际存储大小
20 private intsize;21 //无参构造函数
22 publicLinekedList(){23 this.head = null;24 this.size = 0;25 }26 //判断链表是否为空
27 public booleanisEmpty(){28 return this.size == 0;29 }30 public intsize(){31 return this.size;32 }33 //在链表头添加节点
34 public voidaddFirst(E e){35 add(0, e);36 }37 //在链表尾添加节点
38 public voidaddLast(E e){39 add(size, e);40 }41 //在链表指定位置添加节点
42 public void add(intindex,E e){43 if (index < 0 || index >size) {44 throw new IllegalArgumentException("Index is error.");45 }46 head =add(index, e, head);47 }48 //通过递归实现链表的添加
49 private Node add(intindex,E e,Node node){50 if (index == 0 && node == null) {51 this.size++;52 return newNode(e);53 }54 if (index == 0) {55 this.size++;56 Node newNode = newNode(e);57 //newNode.next = node.next;
58 newNode.next =node;59 //node.next = newNode;
60 returnnewNode;61 }62 node.next = add(index - 1, e, node.next);63 returnnode;64 }65 /**
66 * 用于根据索引查找对应的节点,67 *@paramindex68 *@paramnode69 *@return相应的节点对象70 */
71 private Node getElementByIndex(intindex,Node node){72 if (index == 0 && node != null) {73 returnnode;74 }75 Node ret = getElementByIndex(index - 1, node.next);76 returnret;77 }78 //删除链表头节点
79 publicE removeFirst(){80 return remove(0);81 }82 //删除链表尾结点
83 publicE removeLast(){84 return remove(size - 1);85 }86 //删除指定位置节点,并返回删除节点值
87 public E remove(intindex){88 if(isEmpty()) {89 throw new IllegalArgumentException("List is empty.");90 }91 if (index < 0 || index >=size) {92 throw new IllegalArgumentException("Index is error.");93 }94 Node ret =getElementByIndex(index, head);95 head =remove(index, head);96 returnret.e;97 }98 //递归删除节点值
99 private Node remove(intindex,Node node){100 if (node == null) {101 returnnode;102 }103 if (index == 0) {104 Node delNode =node;105 node =delNode.next;106 delNode.next = null;107 this.size--;108 returnnode;109 }110 node.next = remove(index - 1, node.next);111 returnnode;112 }113 //修改指定位置节点的值,通过递归实现
114 public void set(intindex,E e){115 if(isEmpty()) {116 throw new IllegalArgumentException("List is empty.");117 }118 if (index < 0 || index >=size) {119 throw new IllegalArgumentException("Index is error.");120 }121 set(index, e, head);122 }123 private void set(intindex,E e,Node node){124 if (node == null) {125 return;126 }127 if (index == 0) {128 node.e =e;129 }130 set(index - 1, e, node.next);131 return;132 }133 //获取链表头节点的值
134 publicE getFirst(){135 return get(0);136 }137 //获取链表尾结点的值
138 publicE getLast(){139 return get(size - 1);140 }141 //获取链表制定位置的值,通过递归实现
142 public E get(intindex){143 if(isEmpty()) {144 throw new IllegalArgumentException("List is empty.");145 }146 if (index < 0 || index >=size) {147 throw new IllegalArgumentException("Index is error.");148 }149 returnget(index, head).e;150 }151 private Node get(intindex,Node node){152 if (node == null) {153 returnnode;154 }155 if (index == 0) {156 returnnode;157 }158 Node ret = get(index - 1, node.next);159 returnret;160 }161 //查询链表中的节点是否包含值e
162 public booleancontains(E e){163 returncontains(e, head);164 }165 private booleancontains(E e,Node node){166 if (node == null) {167 return false;168 }169 if (node.e ==e) {170 return true;171 }172 returncontains(e, node.next);173 }174 //重写Object类的toString方法:也是通过链表天然的递归性,来访问175 //链表的每一个节点
176 @Override177 publicString toString() {178 StringBuilder res = newStringBuilder();179 res.append("Font -> ");180 linkToString(head, res);181 returnres.toString();182 }183 private voidlinkToString(Node node,StringBuilder res){184 if (node == null) {185 res.append("NULL");186 return;187 }188 res.append(node.e + " -> ");189 linkToString(node.next, res);190 return;191 }192
193 /*public static void main(String[] args) {194 LinekedList ll = new LinekedList<>();195 for (int i = 0; i < 13; i++) {196 ll.addLast(i);197 System.out.println(ll.toString());198 }199 System.out.println("------------------");200 for (int i = 0; i < 11; i++) {201 Integer ii = ll.removeFirst();202 System.out.println(ii);203 System.out.println(ll.toString());204 }205
206 }*/
207 }