public class MyLinkedList{
//头结点
private Node first;//null
//尾结点
private Node last;//null
//统计结点个数
private int size;//0
public void add(E item) {
//根据传入内容创建新结点
Node newNode=new Node(item);
if(first==null) {//空链表
//新结点既是头结点也是尾结点
first=newNode;
last=newNode;
}else {//非空链表
//尾结点的后驱指针指向新结点
last.next=newNode;
//新结点的前驱指针指向尾结点
newNode.prev=last;
//新结点变成链表的尾结点
last=newNode;
}
//计数加1
size++;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
//从头结点开始逐个向后遍历
Node node=first;
while(node!=null) {
//获取结点内容
E e=node.item;
//拼接结点内容
sb.append(e+",");
//获取下一个结点
node=node.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public int size() {
return size;
}
public Node getNode(int index){
//判断下标
if(index<0 ||index>=size) {
throw new IndexOutOfBoundsException("查找不到");
}
Node node;
if(index node=first;
if(e==null) {
for(int i=0;i node=first;
for(int i=0;i next=node.next;
//再将当前结点的前驱指针,后驱指针,结点内容置为null
node.prev=null;
node.next=null;
node.item=null;
//切换到下一个结点
node=next;
}
first=last=null;
//计数归0
size=0;
}
public void add(int index,E e) {
//判断下标
if(index<0 ||index>=size) {
throw new IndexOutOfBoundsException("查找不到");
}
//根据传入的内容构建新结点、
Node newNode=new Node(e);
//如果插入是头结点
if(index==0) {
//头结点的前驱指针指向新结点
first.prev=newNode;
//新结点的后去指针指向头结点
newNode.next=first;
//再将新结点变为头结点
first=newNode;
size++;
}else if(index==size){//插入是尾结点
add(e);
}else {//插入是中间
//获取上一个结点
Node prevNode=getNode(index-1);
//获取下一个结点
Node nextNode=getNode(index);
//上一个结点的后驱指针指向新结点
prevNode.next=newNode;
//下一个节点的前驱指针指向新结点
nextNode.prev=newNode;
//新结点的前驱指针指向上一个结点
newNode.prev=prevNode;
//新结点的后驱指针指向下一个结点
newNode.next=nextNode;
size++;
}
}
public void remove(int index){
//判断下标
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("查找不到");
}
//如果链表中只有一个结点
if(first==last) {
first=null;
//该节点没有前驱后驱和内容
//但是该结点依然存在在链表上
//所以从链表移除该结点
first=last=null;
size=0;
return;
}
// 如果删除是头结点
if (index == 0) {
Node node = first;
Node secondNode = first.next;
// 头结点后驱指针为null
first.next = null;
// 下一个结点前驱指针为null
secondNode.prev=null;
//清空头结点
first.item=null;
// 下一个结点变为头指针
first = secondNode;
} else if (index == size-1) {// 删除是尾结点
// 获得尾结点的上一个结点
Node lastSecondNode = last.prev;
lastSecondNode.next = null;
//尾结点前驱为null
last.prev = null;
//清空尾结点
last.item=null;
last = lastSecondNode;
}else {//删除中间结点
Node currentnode = getNode(index);
//获取上一个结点
Node prevNode=getNode(index-1);
//获取下一个结点
Node nextNode=getNode(index+1);
prevNode.next=nextNode;
nextNode.prev=prevNode;
currentnode.next=null;
currentnode.prev=null;
currentnode.item=null;
}
size--;
}
public boolean remove(E e) {
//根据内容查找结点下标
int index=indexOf(e);
if(index==-1) {//内容不存在
return false;
}
//根据下标删除结点
remove(index);
return true;
}
public boolean contains(E e) {
return indexOf(e)>0;
}
public E set(int index,E e) {
//判断下标
if(index<0 ||index>=size) {
throw new IndexOutOfBoundsException("查找不到");
}
//根据下标查找原来结点内容
E oldValue =get(index);
//根据下标查找结点
Node node=getNode(index);
//替换内容
node.item=e;
return oldValue;
}
public static void main(String[] args) {
MyLinkedList list=new MyLinkedList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
list.add("fff");
System.out.println(list.size);
System.out.println(list);
//
list.add(5,"PPP");
// list.remove("ccc");
// System.out.println(list.size);
System.out.println(list);
//
// System.out.println(list.get(0));
// System.out.println(list.get(1));
// System.out.println(list.get(2));
// System.out.println(list.get(3));
// System.out.println(list.get(4));
//
// System.out.println(list.indexOf(null));
// System.out.println(list.indexOf("aaa"));
// System.out.println(list.indexOf("bbb"));
// System.out.println(list.indexOf("ddd"));
// System.out.println(list.indexOf("fff"));
// System.out.println(list.indexOf("aaa"));
// System.out.println(list.indexOf("ccc"));
// System.out.println(list.isEmpty());
// list.clear();
// System.out.println(list.isEmpty());
//
// System.out.println(list.first);
// System.out.println(list.last);
}
private static class Node{
//结点内容部分
private E item;
//前驱指针
private Node prev;
//后驱指针
private Node next;
public Node(E item, Node prew, Node next) {
super();
this.item = item;
this.prev = prev;
this.next = next;
}
public Node(E item) {
this.item = item;
}
}
}