欢迎光临散文网 会员登陆 & 注册

java模拟双向链表

2022-08-05 15:12 作者:虚云幻仙  | 我要投稿

/**
* 自定义简易双向链表
*/

public class CustomizeLinkedList<E> {
   private class Node<E>{
       Node<E> prev;
       E item;
       Node<E> next;

       public Node(Node<E> prev, E item, Node<E> next) {
           this.prev = prev;
           this.item = item;
           this.next = next;
       }
   }
   private int size;
   Node<E> first;
   Node<E> last;

   public int size(){
       return size;
   }
   public boolean add(E e){
       linkLast(e);
       return true;
   }
   private void linkLast(E e){
       Node<E> n = new Node<>(last,e,null);
       if (isEmpty()){
           first = n;
       }else {
           last.next = n;
       }
       last = n;
       size++;
   }
   public boolean isEmpty(){
       return size==0;
   }
   public E remove(int index){
       checkIndex(index);
       Node<E> n = getNode(index);
       Node<E> pr = n.prev;
       Node<E> ne = n.next;
       if (pr == null){
           first = ne;
       }else {
           pr.next = ne;
       }
       if (ne == null){
           last = pr;
       }else {
           ne.prev = pr;
       }
       E e = n.item;
       n.prev = null;
       n.next = null;
       n.item = null;
       size--;
       return e;
   }
   private void checkIndex(int index){
       if (index<0||index>=size)throw new IndexOutOfBoundsException();
   }
   private Node<E> getNode(int index){
       Node<E> n;
       if (index < size>>1){
           n = first;
           for (int i = 0;i<index;i++){
               n = n.next;
           }
       }else {
           n = last;
           for (int i = size-1;i>index;i--){
               n = n.prev;
           }
       }
       return n;
   }
   public E set(int index,E e){
       checkIndex(index);
       Node<E> n = getNode(index);
       E oldE = n.item;
       n.item = e;
       return oldE;
   }
   public E get(int index){
       checkIndex(index);
       return getNode(index).item;
   }
   public void addFirst(E e){
       Node<E> n = new Node<>(null,e,first);
       if (isEmpty()){
           last = n;
       }else {
           first.prev = n;
       }
       first = n;
       size++;
   }
   public void addLast(E e){
       linkLast(e);
   }

   public static void main(String[] args) {
       CustomizeLinkedList<String> ll1 = new CustomizeLinkedList<>();
       //测试略
   }
}

java模拟双向链表的评论 (共 条)

分享到微博请遵守国家法律