Java自学笔记—LinkedList

Java自学笔记—LinkedList

特点

底层实现了双向列表和双向队列的特点,list和last属性指向首节点和末节点
每个节点(Node对象),有prev、next、item三个属性,prev指向前一个,next指向后一个,实现双向列表
可以添加任意元素,可重复
线程不安全

自定义双向链表

定义一个Node类

//定义一个Node类,表示双向列表的一个结点
class Node{
    public Object item;//真正存放数据
    public Node next;//指向后一个节点
    public Node pre;//指向前一个节点

    public Node(Object item){
        this.item = item;
    }

    public String toString(){
        return "Node name = " + item;
    }
}

使用

/**
 * @author Lspero
 * @version 1.0
 */

@SuppressWarnings("all")
public class LinkedList01 {
    public static void main(String[] args) {
        //模拟简单的双向列表

        //创建对象(孤立)
        Node jack = new Node("jack");
        Node tom  = new Node("tom");
        Node mary = new Node("mary");

        //链接三个节点,形成双向链表
        // jack -> tom -> mary
        jack.next = tom;
        tom.next = mary;
        //mary -> tom -> jack
        mary.pre = tom;
        tom.pre = jack;

        //首尾节点
        Node first = jack;
        Node last = mary;

        //遍历
        while (true){
            if(first == null){
                break;
            }
            //输出first信息
            System.out.println(first);
            first = first.next;//最后一个next=null
        }

        //从尾到头遍历
        System.out.println("=====从尾到头=====");
        while (true){
            if(last == null){
                break;
            }
            //输出first信息
            System.out.println(last);
            last = last.pre;
        }

        //添加数据
        Node lspero = new Node("lspero");
        jack.next = lspero;
        lspero.pre = jack;
        lspero.next = tom;
        tom.pre = lspero;

        //添加后
        System.out.println("=====添加后=====");
        first = jack;//重置fist
        while (true){
            if(first == null){
                break;
            }
            //输出first信息
            System.out.println(first);
            first = first.next;//最后一个next=null
        }
    }
}

List常用方法

/**
 * @author Lspero
 * @version 1.0
 */
public class List_ {
    @SuppressWarnings("all")
    public static void main(String[] args) {
        // 有序存储,且可以重复
        List list = new ArrayList();
        list.add("jack");
        list.add("tom");
        list.add("mary");
        list.add("tom");
        System.out.println("list = " + list);
        
        // 支持索引
        System.out.println(list.get(3));
        System.out.println("================");
        
        // 遍历方式  迭代器  增强for  普通for
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.print(next);
        }
        
        System.out.println();
        for (Object o : list) {
            System.out.print(o);
        }
        
        System.out.println();
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
        }
    }
}

remove( )和add( )源码

public class LinkedListCRUD {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        System.out.println("linkedlist = " + linkedList);
        //删除,默认第一个
        linkedList.remove();
        /*
        1.执行removeFirst()
        public E remove() {
            return removeFirst();
        }
        2.执行unlinkFirst(f)
        public E removeFirst() {
            final Node<E> f = first;
            if (f == null)
                throw new NoSuchElementException();
            return unlinkFirst(f);
        }

        3.将第一个节点拿掉
        private E unlinkFirst(Node<E> f) {
            // assert f == first && f != null;
            final E element = f.item;
            final Node<E> next = f.next;
            f.item = null;
            f.next = null; // help GC
            first = next;
            if (next == null)
                last = null;
            else
                next.prev = null;
            size--;
            modCount++;
            return element;
        }
        * */

        System.out.println("删除后linkedlist = " + linkedList);

        System.out.println(linkedList.get(1));
        //遍历,实现List,可以用增强for、迭代器、普通for
        /*
          1.LinkedList linkedList = new LinkedList();
              public LinkedList(){}
              这时first = null  last = null
          2.执行添加add
              public boolean add(E e) {
                    linkLast(e);
                    return true;
              }
           3.将新节点加到双向链表最后
              void linkLast(E e) {
                    final Node<E> l = last;
                    final Node<E> newNode = new Node<>(l, e, null);
                    last = newNode;
                    if (l == null)
                        first = newNode;
                    else
                        l.next = newNode;
                    size++;
                    modCount++;
                }
        * */

        // ArrayList改查效率高,LinkedList增删效率高
        // ArrayList  jdk1.2  效率高,不安全  无参默认0 第一次10,1.5倍扩
        // Vector     jdk1.0  效率不高,安全  无参默认10,2倍扩
    }
}

List各实现子类对比

ArrayList改查效率高,LinkedList增删效率高,线程都不安全,常用ArrayList
ArrayList jdk1.2 效率高,不安全 无参默认0 第一次10,1.5倍扩
Vector jdk1.0 效率不高,安全 无参默认10,2倍扩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值