链表结构就像一根链条一样,环环相扣。 每一环 (Node/Entry)都由next ,previous,element (存放数据的地方)
第一个的next 是第二个,第二个的next是第三个,.... 直到最后一个的next 可以为null
最后第一个的previous 是最后第二个,最后第二个的previous是最后第三个,.... 直到第一个的previous 可以为null;
package y.i.d;
public class MakeLinkedList<E> {
private Node first;
private Node last;
private int size;
public void add(E obj) {
Node node= new Node(obj);
// 第一次使用 ,向后添加
if(first==null) {
node.previous = null;
node.next = null;
first=node;
last =node;
}{
node.previous=last;
node.next=null;
last.next=node;
last=node;
}
size++;
}
public void insert(int index,E obj) {
Checkrange(index);
Node newNode = new Node(obj);
Node temp=getNode(index);
System.out.println(temp.element);
System.out.println(index);
if(temp!=null) {
Node upNode=temp.previous;
if(index==0){
first =newNode;
newNode.previous = null;
newNode.next=temp;
temp.previous=newNode;
}else if(index==size-1){
last = newNode;
newNode.next = null;
newNode.previous=temp;
temp.next=newNode;
}else {
upNode.next=newNode;
newNode.previous=upNode;
newNode.next=temp;
temp.previous=newNode;
}
}
}
//tostring
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("[");
Node temp = first;
while(temp!=null) {
sb.append(temp.element+",");
temp=temp.next;
}
sb.setCharAt(sb.length()-1,']'); //最后一位替换字符 ‘’
return sb.toString();
}
// get
public E get(int index) {
Checkrange(index);
return (E)getNode(index).element;
}
//set
public void set( E ele,int index) {
Checkrange(index);
getNode(index).element=ele;
}
// checkRange
private void Checkrange(int index) {
if(index<0||index>size-1) {
throw new RuntimeException("索引不合法");
}
}
private Node getNode(int index) {
Node temp;
// 二分法优化
if(index<=(size>>1)) {
temp =first;
for(int i=0;i<index;i++) {
temp=temp.next;
}
}else {
temp =last;
for(int i=size-1;i>index;i--) {
temp=temp.previous;
}
}
return temp;
}
//remove
public void remove(int index) {
Checkrange(index);
Node tempNode = getNode(index);
if(tempNode!=null) {
Node up=tempNode.previous;
Node down=tempNode.next;
if(up!=null) {
up.next=down;
}
if(down!=null) {
down.previous=up;
}
if(index==0) {
first=down;
}
if(index==size-1) {
last=down;
}
size--;
}
}
public static void main(String[] args){
MakeLinkedList<String> s1 = new MakeLinkedList<>();
s1.add("1");
s1.add("2");
s1.add("3");
s1.insert(2,"11111");
System.out.println(s1.toString());
}
}
// 定义链表节点 的基础结构
class Node{
Node previous;
Node next;
Object element;
public Node(Object element) {
super();
this.element=element;
}
}