/** * 链表数据 * @param <E> */ public class Node<E> { private E data; private Node<E> next; public Node(E data) { this.data = data; this.next = null; } public Node<E> getNext() { return next; } public void setNext(Node<E> next) { this.next = next; } public E getData() { return data; } }
public class Link<E> { Node<E> head; int size = 0; public Link() { head = null; } /** * 添加元素 * @param data */ public synchronized void add(E data) { Node<E> node = new Node<>(data); if (head == null) { head = node; size = 1; } else { Node<E> temp = head; size = 2; while (temp.getNext() != null) { size++; temp = temp.getNext(); } temp.setNext(node); } } /** * 获取元素 * @param i * @return */ public E get(int i) { if (i > size) { throw new RuntimeException("超出链表长度"); } Node<E> temp = head; if (i == 0) { return temp.getData(); } else { int index = 1; while (temp.getNext() != null) { temp = temp.getNext(); if (index++ == i) { break; } } } return temp.getData(); } /** * 通过下标删除 * @param i */ public synchronized void remove(int i) { if (i >= size) { throw new RuntimeException("超出链表长度"); } Node<E> temp = head; if (i == 0) { head = temp.getNext(); size = size - 1; } else { int index = 1; while (temp.getNext() != null) { if (index++ == i) { temp.setNext(temp.getNext().getNext()); size = size - 1; break; } temp = temp.getNext(); } } } /** * 通过元素删除 * @param node */ public synchronized void remove(E node) { Node<E> headNode = head; if (node.equals(headNode.getData())) { if (headNode.getNext() == null) { head = null; size = 0; size = size - 1; return; } else { head = headNode.getNext(); size = size - 1; return; } } Node<E> curNode = headNode.getNext(); Node<E> preNode = headNode; while (preNode.getNext() != null) { if (node.equals(curNode.getData())) { preNode.setNext(curNode.getNext()); size = size - 1; break; } preNode = curNode; curNode = curNode.getNext(); } } /** * 链表反转 */ public void reverse() { if (head == null || head.getNext() == null) { return; } Node<E> prev = null; Node<E> node = head; while (node != null) { Node<E> next = node.getNext(); node.setNext(prev); prev = node; node = next; } head = prev; } }
public class Test { public static void main(String[] args) { Link<String> link = new Link<>(); for (int i = 0; i < 10; i++) { link.add(String.valueOf(i)); } for (int i = 0; i < link.size; i++) { System.out.printf(link.get(i)+ "|"); } System.out.println("size=" + link.size); // link.remove(0); // link.remove("9"); link.reverse(); for (int i = 0; i < link.size; i++) { System.out.printf(link.get(i) + "|"); } System.out.println("size=" + link.size); } }