标签:
在平常写项目中用最多的是ArrayList,很少用LinkedList,这次看core java觉得还是蛮好用的。
尽管数组在连续的存储位置上存放对象引用,方便查询数据。但链表却将每个对象存放在独立的结点中。每个结点还存放着序列中下一个结点的引用,这样方便添加和删除数据。在Java程序设计语言中,所有的链表实际上都是双向链表——即每个结点还存放着指向前驱结点的引用。
1.首先模拟LinkedList的源码
package linkedList; public class LinkedList_<E> { //链表的长度 private static int size; //链表第一个结点 private Node<E> first; //链表最后一个结点 private Node<E> last; public LinkedList_(){ } /** * 添加表头 * @param e 结点中的数据 */ public void addFirst(E e){ Node<E> f = first; Node<E> newNode = new Node<E>(null,e,f); first = newNode; //首次添加元素,第一个元素和最后一个相同 if(f==null){ last = newNode; } //将元素放在表头 else{ f.prev=newNode; } size++; } /** * 添加表尾 * @param e 结点中的数据 */ public void addLast(E e){ Node<E> l = last; Node<E> newNode = new Node<E>(l,e,null); last = newNode; //开始添加链表 if(l==null){ first = newNode; }else{ l.next=newNode; } size++; } /** * 添加元素,只能增加到表尾 * @param e */ public void add(E e){ addLast(e); } /** * @return 返回链表长度 */ public int size(){ return size; } /** * 删除表头 */ public void removeFirst(){ Node<E> f = first; if(f==null) System.out.println("该链表没有元素"); else{ Node<E> next = f.next; first = next; //如果这个链表中只有一个元素 if(next == null){ last = null; }else{ first.prev=null; } f.data=null; //将第一个结点数据置为空 f.next=null; size--; //总数减一 } } /** * 删除表尾 */ public void removeLast(){ Node<E> l = last; if(l==null){ System.out.println("该链表没有元素"); }else{ Node<E> prev = l.prev; last = prev; if(prev == null){ first=null; }else{ last.next=null; } l.data=null; //将最后一个结点中的数据置为空 l.prev=null; size--; } } /** * 内部类,链表的结点 * @author 堕落梦醒 * * @param <E> */ private static class Node<E>{ E data; Node<E> prev; Node<E> next; public Node(Node<E> prev, E data, Node<E> next) { super(); this.prev = prev; this.data = data; this.next = next; } } }
2.双向链表、添加和删除结点原理图
双向链表
从链表中删除一个结点
添加结点
3.从LinkedList的实现代码可以看出,LinkedList只能在链表的结尾添加元素,不能在中间添加。如果要在中间添加,只能借助ListIterator。
package linkedList; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class LinkedListTest { public static void main(String[] args) { List<String> a = new LinkedList<String>(); a.add("a"); a.add("b"); a.add("c"); List<String> b = new LinkedList<String>(); b.add("e"); b.add("f"); b.add("g"); b.add("h"); ListIterator<String> aIter = a.listIterator(); ListIterator<String> bIter = b.listIterator();
if(aIter.hasNext())
aIter.next(); while(bIter.hasNext()){ aIter.add(bIter.next()); } System.out.println(a); } }
运行结果:
[a, e, b, f, c, g, h]
标签:
原文地址:http://www.cnblogs.com/duoluomengxing/p/4686694.html