LinkedList相比于ArrayList的底层实现区别是,Linkedlist的底层为一个双向链表,而不是数组了。
画个丑图表示下:
在linkedList的底层实现中,存储一个表头first节点指向链表的第一个节点,存储一个last节点,指向链表的最后一个节点,而每个节点又存储了一个指向其前一个节点(previous)和后一个节点(next)的指针。
Node节点的表示:
package com.java.myutil;
public class Node {
Object element;
Node next;
Node previous;
Node(Object element, Node next, Node previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
LinkedList的实现:
package com.java.myutil;
//链表的结构
public class LinkedList implements Collection{
private int size=0;
private Node first;//表头
private Node last;//表尾
//往链表中添加元素
public void add(Object object) {
Node l=last;
//往表尾插入元素,则新节点的previous指向的last,next指向空
Node newNode=new Node(object,null,last);
//重新将表尾赋值为新建的节点
last = newNode;
//如果原始链表为空,则头结点赋值为新建的节点
if (l == null)
first = newNode;
else//否则,原来的尾节点的next指向新节点
l.next = newNode;
size++;
}
//链表中删除元素
public void remove(Object object){
for (Node node = first; node!=null; node=node.next) {
if (node.element.equals(object)) {
//删除是第一个节点
if (node.previous==null) {
first=node.next;
}else {
node.previous.next=node.next;
node.previous=null;
}
//删除的是最后一个节点
if (node.next==null) {
last=node.previous;
}else{
node.next.previous=node.previous;
node.next=null;
}
node.element=null;
size--;
}
}
}
//遍历链表,拿i位置的元素
public Object get(int i) {
Node n= first;
for (int index = 0; index < i; index++) {
n=n.next;
}
return n.element;
}
public int size() {
return size;
}
public Iterator iterator() {
return new LinkedListIterator();
}
//迭代器的实现
private class LinkedListIterator implements Iterator{
private int index=0;
private Node node=first;//指向头结点
private Node lastReturned;//指向上一次操作的node
public boolean hasNext() {
return index!=size;
}
public Object Next() {
lastReturned=node;
index++;
node=node.next;
return lastReturned.element;
}
public void remove() {
Node lastNext=lastReturned.next;
//调用LinkedList的remove(Object o)方法
LinkedList.this.remove(lastReturned.element);
//下面注释的代码,以后要是实现previou方法,就需要,暂时不写
//if (node==lastReturned)
// node = lastNext;
// else
index--;
lastReturned=first;
}
}
public static void main(String[] args) {
LinkedList linkedList=new LinkedList();
linkedList.add("aa1");
/* linkedList.add("bb2");
linkedList.add("cc3");
linkedList.add("dd4");*/
Iterator it=linkedList.iterator();
while (it.hasNext()) {
System.out.println(it.Next());
}
//System.out.println(linkedList.get(3));
// linkedList.remove("cc3");
Iterator it2=linkedList.iterator();
while (it2.hasNext()) {
String data =(String )it2.Next();
if (data.equals("aa1")) {
it2.remove();
}
}
System.out.print(linkedList);
}
}