码迷,mamicode.com
首页 > 其他好文 > 详细

LinkedList总结

时间:2015-07-29 18:52:47      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

  在平常写项目中用最多的是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]

 

 

LinkedList总结

标签:

原文地址:http://www.cnblogs.com/duoluomengxing/p/4686694.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!