一:节点类(Node.java)
package cn.ZiJiCollection;
public class Node {
//每个节点包含三个内容
Node previous;
Node next;
Object element;
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
public Node(Object element) {
super();
this.element = element;
}
}
二:SxtLinkedList.java
package cn.ZiJiCollection;
public class SxtLinkedList<E> {
//定义初始节点
private Node first;
private Node last;
private int size;
public void add(E element) {
//建立节点node
Node node = new Node(element);
//判断初始节点为空,为空则建立节点
if(first==null) {
first=node;
last=node;
}
else {//节点:{first last node}
//开始情况
node.previous=last;
node.next=null;
//last后移,node变成新的last
last.next=node;
last=node;
}
size++;
}
//打印
public String toString() {
StringBuilder str=new StringBuilder("[");
Node temp=first;
while(temp!=null) {
str.append(temp.element+",");
temp=temp.next;
}
//将最后的逗号替换成“】”
str.setCharAt(str.length()-1, ']');
return str.toString();
}
public void remove(int index) {
SuoYingHeLi(index);
Node temp=findNode(index);
Node up=temp.previous;
Node down=temp.next;
if(up!=null) {//判断是否为空
up.next=down;
}
if(down!=null) {
down.previous=up;
}
if(index==0) {//删第一个
first=down;
}
if(index==size-1) {//删最后一个
last=up;
}
size--;
}
//查找指定位置元素
public E get(int index) {
SuoYingHeLi(index);
Node temp=findNode(index);
return temp!=null?(E)temp.element:null;
}
//判断索引是否合理进行封装
private void SuoYingHeLi(int index) {
if(index<0||index>size) {
throw new RuntimeException("索引不合法!");
}
}
//查找节点
public Node findNode(int index) {
SuoYingHeLi(index);
//合理,提高查找效率(二分法)
Node temp=null;
if(index<=(size>>1)) {//size>>1相当于除于2
temp=first;
for(int i=0;i<index;i++) {
temp=temp.next;
}
}
else {
temp=last;
for(int j=(size-1);j>index;j--) {
temp=temp.previous;
}
}
return temp;
}
//添加节点
public void add(int index,E element) {
SuoYingHeLi(index);
Node newNode=new Node(element);
Node temp=findNode(index) ;
if(temp!=null) {
Node up=temp.previous;
up.next=newNode;
newNode.previous=up;
temp.previous=newNode;
newNode.next=temp;
}
if(index==0) {
first.previous=newNode;
newNode.next=first;
first=newNode;
}
if(index==size-1) {
last.next=newNode;
newNode.previous=last;
last=newNode;
}
}
public static void main(String[] args) {
SxtLinkedList<String> list=new SxtLinkedList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
System.out.println(list);
System.out.println(list.get(4));
list.remove(4);
System.out.println(list);
list.add(3, "唐");
System.out.println(list);
}
}
三:画图解释
四:结果显示
[a,b,c,d,e,f]
e
[a,b,c,d,f]
[a,b,c,唐,d,f]
五:待完善之处
在增加节点add(int index,E element) 方法时,如果在0处添加数据,会抛出异常