class MyLinkedList {
private class Node{
E element;
Node previous;//节点
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);//创建一个节点,其中存放的数据就是element所接受的到的值
if (count==0){//判断链表,如果是空链表,那么这个新节点,就作为头结点
this.first = node;
}else {//否则不是一个空链表,要把最后一个节点的下一个节点设置为新的节点
this.last.next = node;
node.previous = this.last;//把这个新的节点上一个节点,设置为这个链表之前的那个尾节点
}
this.last = node;//把链表的尾节点设置为新节点
count++;
}
public void add(int index,E element){
Node node = new Node(element);
if(index==0){
this.first.previous = node;
node.next = this.first;
this.first = node;
}else if(index == count){
this.last.next=node;
node.previous=this.last;
this.last=node;
}else {
Node target = getNode(index);
node.next = target;
node.previous = target.previous;
target.previous.next = node;
target.previous = node;
}
count++;
}
private Node getNode(int index){
if(index<0||index>=count){
throw new IndexOutOfBoundsException("下标越界");
}
Node node = this.first;
for (int i=0;i<index;i++){
node = node.next;
}
return node;
}
//删除指定下表的元素
public E remove(int index){
Node node = getNode(index);
removeNode(node);
return node.element;
}
private void removeNode(Node node) {
if(count1){
this.first = null;
this.last = null;
count–;
return;
}
if (nodethis.first){
this.first = this.first.next;
this.first.previous.next=null;
this.first.previous=null;
}else if (node == this.last){
this.last = this.last.previous;
this.last.next.previous=null;
this.last.next=null;
}else {
node.previous.next = node.next;
node.next.previous=node.previous;
node.previous=null;
node.next=null;
}
count–;
}
//根据元素进行删除
public boolean remove(E element) {
Node node = getNode(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;
}
//根据下标获取指定的元素
public E get(int index){
Node node = getNode(index);
return node.element;
}
public int size(){
return count;
}
public boolean contains(E element){
return indexOf(element)!=-1;
}
public int indexOf(E element){
Node node = this.first;
for (int i=0;i<count;i++){
if(node.element.equals(element)){
return i;
}
}
return -1;
}
public String toString(){
if(count==0) return "[]";
StringBuilder stringBuilder = new StringBuilder("[");
Node node = this.first;
for(int i=0;i<count;i++){
stringBuilder.append(node.element).append(",");
node=node.next;
}
stringBuilder.replace(stringBuilder.length()-2,stringBuilder.length(),"]");
return stringBuilder.toString();
}}}