手写双链表

链表要从数据结构开始说起了,虽然大学时候简单学过一点点数据结构,但我一直不理解数据结构这门课程到底讲什么,只简单的知道链表.这次学习Handler源码,在追踪Message原理的时候了解到Message其实就是一个单链表,就学习了一下装逼的双链表.通过对双链表的仔细了解,认识到数据结构就是组成复杂数据的模式.
package com.yang.test;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;

public class MyDoubleLink implements Iterable<Object>{

    private class Node{
        Node(Object data){
            this.data = data;
        }
        Node next;
        Node prev;
        Object data;
    }

    private Node head;
    private Node rear;

    public void add(Object data){
        Node node = new Node(data);
        if(head == null){
            //如果是第一个节点,就让head和rear元素都指向它
            head = node;//始终指向首节点,删除节点时候也可作为游标完成节点删除
            rear = node;//相当于一个游标,使新节点和链接链接起来,如果没有它就没办法取出之前链表的最后一个节点
        }else{
            //head元素始终指向第一个节点,rear元素总是指向最后一个节点
            rear.next = node;//此时rear就是第一个节点的对象,让首节点head的next指向新添加的节点node
            node.prev = rear;//让新添加节点的prev指向上一个节点的对象即rear
            rear = node;//让rear本身指向新添加的节点
        }
    }

    public void remove(Object data){
        Node node = find(data);
        //要删除一个节点就是删除一个对象,当没有引用(变量)指向这个对象的时候,这个对象就会很快被回收掉。
        //所以要删除这个节点,就需要把所有指向这个对象的引用(变量)都去掉。(注意:这个对象对其他对象的引用不影响对它本身的回收)
        if(node != null){
            if(node == head && node == rear){//只有一个节点
                head = null;
                rear = null;
            }else if(node == head){//头结点
                head = head.next;
                head.prev = null;
            }else if(node == rear){//尾节点
                rear = rear.prev;
                rear.next = null;
            }else{//中间节点
                node.prev.next = node.next;
                node.next.prev = node.prev;
            }
        }
    }

    public boolean contains(Object data){
        Node node = find(data);
        return node != null;
    }

    private Node find(Object data){
        Node node = head;
        while (node != null) {
            if(node.data.equals(data) && node.data.hashCode() == data.hashCode()){
                break;
            }else{
                node = node.next;
            }

        }
        return node;
    }

    public void print(){
        Node temp = head;
        while(temp != null){
            System.out.println(temp.data+",");
            temp = temp.next;
        }
    }

    //使该链表的对象可以使用增强for循环
    public Iterator<Object> iterator() {
        Iterator<Object> iterator = new Iterator<Object>() {
            private Node temp = head;
            public void forEachRemaining(Consumer<? super Object> arg0) {
                // TODO Auto-generated method stub

            }

            public boolean hasNext() {
                return temp != null;
            }

            public Object next() {
                Object data = temp.data;
                temp = temp.next;
                return data;
            }

            public void remove() {
                // TODO Auto-generated method stub

            }
        };
        return iterator;
    }

}

–作为普通android程序员,有了这个carry技能,的确可以在面试时候小小的装下比了

你可能感兴趣的:(java,数据结构,链表,message,双链表)