import java.util.*; import static java.lang.Math.*; //双向链表 public class MylinkedList{ private class Node{ E element; Node prev; Node next; //带参数构造方法 public Node(E element){ this.element=element; } } private Node first; private Node last; private int count; //向集合中添加元素 public void add(E element){ Node node=new Node(element); if(this.count==0){ this.first=node; }else { this.last.next=node; node.prev=this.last; } this.last=node; count++; } //指定位置向集合中添加元素 public void add(int index,E element){ Node node=new Node(element); if(index>count){ System.out.print("超出链表长度"); }else if(index==0){ this.first.prev=node; node.next=this.first; this.first=node; }else if(count==index){ this.last.next=node; node.prev=this.last; this.last=node; }else{ Node target=getNode(index); node.next=target; node.prev=target.prev; target.prev.next=node; target.prev=node; } count++; } //删除指定下标的元素 public E remove(int index){ Node node=getNode(index); removeNode(node); return node.element; } //根据节点中数据进行删除 public boolean remove(E element){ Node node=new Node(element); if (node==null){ return false; } removeNode(node); return true; } //根据元素获取节点 private Node getNode(E element){ Node node=this.first; while(node!=null){ if (node.element.equals(element)){ return node; } node=node.next; } return null; } //清空链表 public void clear(){ this.first=null; this.last=null; count=0; } //将链表中指定下标节点的元素值,修改为指定的值 public E set(int index,E element){ Node node=getNode(index); E ele=node.element; node.element=element; //返回修改之前的元素值 return ele; } private void removeNode(Node node) { if (count==1){ this.first=null; this.last=null; count--; return; } if (node==this.first){ this.first=this.first.next; //头节点的前一个的下一个 this.first.prev.next=null; this.first.prev=null; }else if(node==this.last){ this.last=this.last.prev; this.last.prev.next=null; this.last.next=null; }else{ node.prev.next=node.next; node.next.prev=node.prev; node.next=null; node.prev=null; } count--; } //根据下标获取所需节点 private Node getNode(int index) { if(index<0||index>count){ throw new IndexOutOfBoundsException("下表越界"); } Node node=this.first; for(int i=0;i



