自定义实现链表很简单,只需要明白链表是什么样子的数据结构。
下图表示一种单向列表。其中指针first指向队头,last指向队尾,curr指向当前读的数据。
下面是我的实现代码,很简单,明白上述结构后,关键是构造一个内部类,里面包含一个指向下一个元素的对象(指向下一个元素的指针)
public class MyLinkedList<T>{ /** * 指向list中最后一个元素 */ Node<T> last; /** * 指向list中第一个元素 */ Node<T> first; /** * 指向当前读取的元素 */ Node<T> currRead; private int size ; /** * <默认构造函数> */ public MyLinkedList(){ size = 0; last = new Node(null,-1); first = last; currRead = first; } /** * 往链表中添加数据(队尾添加数据) * <功能详细描述> * @param element * @return * @see [类、类#方法、类#成员] */ public T add(T element){ Node<T> newNode = new Node<T>(null,element); last.next = newNode; last = newNode; if(size == 0){ first = newNode; } size ++; return element; } /** * 移除链表中的数据(队头移除) * <功能详细描述> * @return * @see [类、类#方法、类#成员] */ public T remove(){ if(size == 0){ System.out.println("empty list "); currRead = first; return null; } T result = first.element; first = first.next; currRead = first; size--; return result; } /** * 获取队列中的元素 * <功能详细描述> * @return * @see [类、类#方法、类#成员] */ public T get(){ if(currRead.next == null){ setReadAgain(); return currRead.element; } T result = currRead.element; currRead = currRead.next; return result; } /** * 再次从头开始读取数据 * <功能详细描述> * @see [类、类#方法、类#成员] */ public void setReadAgain() { currRead = first; } public String toString(){ StringBuilder sb = new StringBuilder(); for(int i=0;i<size;i++){ T ele = get(); sb.append(currRead.element + "-->"); } return sb.toString(); } /** * 获取队列大小 * <功能详细描述> * @return * @see [类、类#方法、类#成员] */ public int getSize(){ return this.size; } class Node<T> { Node<T> next; T element; public Node( Node<T> next, T element){ this.next = next; this.element = element; } }
实践一下,看能不能使用
public class Test { public static void main(String[] args){ MyLinkedList linkedList = new MyLinkedList(); System.out.println("-------start-------"); System.out.println(linkedList.toString()); for (int i=0;i<5;i++){ linkedList.add(i+1); } System.out.println(linkedList.toString()); for(int i=0;i<5;i++){ System.out.println(linkedList.remove()); } System.out.println(linkedList.toString()); System.out.println("-------end-------"); }
下面是结果