package suanfa; /** * 当年学习数据结构和算法的时候,自己写的一个LinkedList, * 可以看到,LinkedList是动态链表,插入和删除的效率比较高,查询其长度的效率比较低 * * 推荐一本学习数据结构和算法的书籍,《数据结构java版》清华大学出版社,译者梁志敏 * * @author 台哥 https://blog.csdn.net/chaohi * * @param <T> */ public class LinkedList<T> { private Node<T> node; private int listSize; // 构造方法 public LinkedList() { node = new Node<T>(); listSize = 0; } // 在索引index处添加元素 public void add(int index, T element) { if (index < 0 || index > listSize) { return; } Node<T> preNode = node; for (int i = 0; i < index; i++) preNode = preNode.next; Node<T> newNode = new Node<T>(element); if (preNode.next != null) { preNode.next.prev = newNode; newNode.next = preNode.next; } newNode.prev = preNode; preNode.next = newNode; listSize++; } // 在尾部添加元素并返回true public boolean add(T element) { this.add(listSize, element); return true; } // 返回第一个element元素的索引 public int indexOf(T element) { Node<T> curNode = node; for (int i = 0; i <= listSize - 1; i++) { curNode = curNode.next; if (curNode.equals(element)) return i; } return -1; } // 返回最后一个element元素的索引 public int lastIndexOf(T element) { int index = -1; Node<T> curNode = node; for (int i = 0; i <= listSize - 1; i++) { curNode = curNode.next; if (curNode.equals(element)) index = i; } return index; } // 得到索引index处的节点 public Node<T> getNode(int index) { Node<T> curNode = node; for (int i = 0; i <= index; i++) { curNode = curNode.next; } return curNode; } // 得到索引index处的元素 public T get(int index) { if (index < 0 || index >= listSize) { return null; } return this.getNode(index).value; } // 为索引index处的元素赋值 public T set(int index, T element) { if (index < 0 || index >= listSize) { return null; } T previousValue = this.get(index); Node<T> curNode = this.getNode(index); curNode.value = element; return previousValue; } // 删除索引index处的元素 public T remove(int index) { if (index < 0 || index >= listSize) { return null; } Node<T> curNode = this.getNode(index); curNode.prev.next = curNode.next; if (curNode.next != null) curNode.next.prev = curNode.prev; listSize--; return curNode.value; } // 删除列表中的element元素 public boolean remove(T element) { int index = this.indexOf(element); if (index != -1) { this.remove(index); return true; } return false; } // 返回列表的长度 public int size() { return listSize; } // 判断列表是否为空 public boolean isEmpty() { return listSize == 0; } // 清空列表 public void clear() { node = null; listSize = 0; } // 判断列表中是否存在元素element public boolean contains(T element) { return !(this.indexOf(element) == -1); } // 节点 @SuppressWarnings("hiding") private class Node<T> { public T value; public Node<T> prev; public Node<T> next; public Node() { }; public Node(T t) { this.value = t; } } // 测试 public static void main(String[] args) { LinkedList<String> l = new LinkedList<String>(); l.add("台哥"); l.add("taigecailing"); l.add(1, "当当当当"); System.out.println("size=:" + l.size()); for (int i = 0; i < l.size(); i++) { System.out.print(l.get(i) + " , "); } System.out.println(); l.remove(2); System.out.println(l.get(2)); } }