一、定义
除了头结点和尾节点,一个节点有唯一的前驱和后继,头结点无前驱,尾节点后继为null。
二、优缺点
优点:增删操作比较快,因为无需移动节点元素
缺点:查询比较慢,因为无索引,故无法像数组一样根据索引通过一次计算定位
三、简单实现
1、定义一个节点类,包含指向下一个节点的next节点和data(数据)两个属性
public class Node {
public Node next;
public Object data;
public Node(){}
public Node(Object value){
this.data = value;
}
public Node(Node node,Object value){
this.next = node;
this.data = value;
}
}
2、执行插入操作(如下图)
public void add(int index, Object element) {
/** 定义一个a节点指向head节点
* 循环当index-1的位置时,a.next指向了原来的index位置
* p指向了原来index的前驱
* 那么,可以表明:a.next为新节点的直接后继,a为新节点的直接前驱
* */
Node a = head;
//初始化新节点
Node newNode = new Node ( );
newNode.data = element;
newNode.next = null;
//找后继
for (int i = 0; i < index; i++) {
a = a.next;
}
//此时的p.next指向了要插入的后继
newNode.next = a.next;
//p指向了要插入的前驱节点
a.next = newNode;
size ++;
}
3、删除操作
只需将原来连接在一起的断开,使其前驱指向要删除节点的后继
public Object remove(int index) {
Node p = head;
for (int i =0 ;i < index ;i++ ){
p = p.next;
}
p.next = p.next.next;
size --;
return toString ();
}
4、查询方法
public Object get(int index) {
Node p = head.next;
for (int i = 0; i < index; i++) {
p = p.next;
}
return p.data;
}
四、测试执行
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList ();
list.add ( 111 );
list.add ( 222);
list.add ( 555 );
list.add ( 666 );
list.add ( 1,444 );
System.out.println (list.toString ());
}
运行结果-----------
[111,444,222,555,666,]
Process finished with exit code 0
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList ();
list.add ( 111 );
list.add ( 222);
list.add ( 555 );
list.add ( 666 );
list.add ( 1,444 );
System.out.println (list.toString ());
//执行一个删除操作
list.remove ( 2 );
System.out.println (list.toString ());
}
运行结果-------------
[111,444,222,555,666,]
[111,444,555,666,]
Process finished with exit code 0