import java.util.*;
import static java.lang.Math.*;
//双向链表
public class MyLinkedList<E> {
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<index;i++){
node=node.next;
}
return node;
}
//根据下标获取所需元素的值
private E get(int index){
Node node=getNode(index);
return node.element;
}
//链表中节点的个数
public int size(){
return count;
}
//判断是否包含某个元素
public int contains(E element{
return indexof(element);
}
//返回元素第一次出现的下标
private 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 null;
}
StringBuilder stringBuilder=new StringBuilder("[");
Node node=this.first;
for(int i=0;i<count;i++){
stringBuilder.append(node.element).append(",");
node=node.next;
}
int len=stringBuilder.length();
stringBuilder.replace(len-2,len,"]");
return stringBuilder.toString();
}
}
Java实战:双向链表
最新推荐文章于 2024-04-28 01:00:25 发布