LinkedList解析

1.LinkedList是个双向循环链表。见下图:
这里写图片描述

2.下面自己照jdk写个简单例子:

//首先是链表的结点的数据结构结构
static class Entry<E> {
    E element; // 存放的元素
    Entry<E> next; // 指向下一个 Entry节点     
    Entry<E> previous; // 指向上一个Entry节点
        Entry(E element, Entry<E> next, Entry<E> previous) {
            this.element = element;
            this.next = next;
            this.previous = previous;
        }
    }
//下面是链表的实现
public class MyLinkedList<E> {
    // 头结点,一个标识,靠它来进入链表
    private transient Entry<E> header = new Entry<E>(null, null, null);
    private transient int size = 0;

    public MyLinkedList() {
        // 构造,下一个和前一个都指向自身,见上图的空链表
        header.next = header.previous = header;
    }

    // 添加到头部,可以添加空值
    public void addFirst(E e) { 
        addBefore(e, header.next);
    }

    private Entry<E> addBefore(E e, Entry<E> entry) {
        /*
         * 1.空链表情况:newEntry的next指向header,newEntry的previous指向header。[header空时: next和previous都指向header]
         * 2.非空链表情况:newEntry的next指向header的next,newEntry的previous指向header.next.previous 就是header本身
         */
        Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
        /*
         * 1.空链表情况:newEntry.previous就是header 它的next指向newEntry
         * 2.非空链表情况:newEntry.previous就是header 让header.next指向newEntry
         */
        newEntry.previous.next = newEntry;
        /*
         * 1.空链表情况:newEntry.next上面已经指向了header 所以就是让header的previous也指向newEntry
         * 2.非空链表情况:newEntry.next 是header的previous ,
         * 所以就是让header的前一个结点的previous指向newEntry
         */
        newEntry.next.previous = newEntry;
        size++;
        // 如看不懂,见对着上面的图就能分析清楚
        return newEntry;
    }

    public void addLast(E e) { // 自己根据addFirst可以分析出来
        addBefore(e, header);
    }

    public boolean remove(Object o) {
        for (Entry<E> e = header.next; e != header; e = e.next) {//遍历链表
            if (o.equals(e.element)) { //找到了这个结点
                remove(e);//该表指针关系
                return true;
            }
        }
        return false;
    }
    private E remove(Entry<E> e) {
        E result = e.element;
        //这个结点的上一个结点的下一个指向这个结点的下一个,就是把它的上一级的关系给踢出了
        e.previous.next = e.next;
        //这个结点的 下一个结点 的 上一个 指向 这个结点的前一个结点, 就是踢出了 下一级的关系
        e.next.previous = e.previous;
        e.next = e.previous = null;//清除
        e.element = null; // 清除
        size--;
        return result;
    }
    }

好了基本就是这样,其实就是数据结构中的双向循环链表,大学学过数据结构的都应该明白。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值