/** * @desc: 双链表实现 * @author: 毛会懂 * @create: 2020-12-28 13:58:00 **/ public class MyDoubleLinkList<T> implements MyList<T> { //头指针 private Node head; //尾指针(为了方便向链表末尾插入元素,也为了方便取最后一个元素,会多定义一个字段) private Node last; //元素数量 private Integer count; public MyDoubleLinkList() { //默认指向空节点 head = new Node(null,null,null); last = null; count = 0; } /** * 链表最后添加元素 **/ @Override public void add(T t) { if(count == 0){ Node newNode = new Node(t,head,null); head.next = newNode; last = newNode; }else { Node newNode = new Node(t, last, null); last.next = newNode; last = newNode; } count++; } /** * 指定位置添加元素 **/ @Override public void add(Integer i, T t) { if(i < 0 || i > count){ throw new RuntimeException("位置不正确"); } //添加最后一个元素 if(i == count){ add(t); return; } //找到第i个位置的上一个元素 Node preNode = head; for(int index = 0;index < i;index++){ preNode = preNode.next; } //第i个元素 Node cur = preNode.next; //构造新元素 Node newNode = new Node(t,preNode,cur); preNode.next = newNode; cur.pre = newNode; count++; } /** * 移除指定位置的元素 **/ @Override public T remove(Integer i) { if(i < 0 || i >= count){ throw new RuntimeException("下标超过范围"); } if(count == 0){//没有元素 return null; } Node pre = head; //查询第i个位置的前一个Node for(int index = 0; index <i;index++){ pre = pre.next; } Node cur = pre.next; //当前Node Node next = cur.next; //当前的下一个Node if(next == null){ //移除的是最后一个元素 pre.next = null; cur.pre = null; last = pre; //移除最后一个元素,需要重置last }else{ //不是最后一个元素 pre.next = next; next.pre = pre; } count--; return cur.item; } /** * 更新指定位置的数据 **/ @Override public void update(int i, T t) { if(i < 0 || i >= count){ throw new RuntimeException("下标超过范围"); } Node cur = head; for(int index = 0; index <=i;index++){ cur = cur.next; } cur.item = t; } @Override public T get(int i) { if(i < 0 || i >= count){ throw new RuntimeException("下标超过范围"); } Node cur = head.next; for(int index = 0;index <i;index++){ cur = cur.next; } return cur.item; } /** * 查找元素 **/ @Override public Integer indexOf(T t) { if(count == 0){ return null; } Node cur = head.next; for(int i = 0; i < count;i++){ if(cur.item.equals(t)){ return i; } cur = cur.next; } return null; } @Override public Boolean isEmpty() { return count == 0; } @Override public Integer length() { return count; } @Override public void clean() { head = new Node(null,null,null); last = null; count = 0; } /** * 返回第一个元素 **/ public T getFirst(){ if(isEmpty()){ return null; } return head.next.item; } /** * 返回最后一个元素 **/ public T getLast(){ if(isEmpty()){ return null; } return last.item; } @Override public Iterator<T> iterator() { return new myIterator(); } private class myIterator implements Iterator<T>{ private Node node; public myIterator(){ node = head; } @Override public boolean hasNext() { return node.next != null; } @Override public T next() { T t = node.next.item; node = node.next; return t; } } private class Node{ //元素 private T item; //指向上一个 private Node pre; //指向下一个 private Node next; public Node(T item, Node pre, Node next) { this.item = item; this.pre = pre; this.next = next; } } }
public static void main(String[] args) {
MyList<Integer> myList = new MyDoubleLinkList<>();
myList.add(101);
myList.add(0,100);
System.out.println(myList.length());
myList.forEach(System.out::println);
System.out.println("--------");
//删除
Integer del = myList.remove(1);
System.out.println("删除的元素:" +del);
//更新
myList.update(0,1000);
for (Integer item : myList) {
System.out.println(item);
}
System.out.println("-----------");
myList.add(2000);
myList.add(2,3000);
System.out.println("get到的元素:" + myList.get(1));
System.out.println("查找元素:" + myList.indexOf(1000));//1000的下标为0
System.out.println("第一个元素:" + ((MyDoubleLinkList)myList).getFirst());
System.out.println("最后一个元素:" + ((MyDoubleLinkList)myList).getLast());
myList.clean();
}