手写双链表

来源:互联网 发布:淘宝情趣用品专卖店 编辑:程序博客网 时间:2024/04/29 17:25
链表要从数据结构开始说起了,虽然大学时候简单学过一点点数据结构,但我一直不理解数据结构这门课程到底讲什么,只简单的知道链表.这次学习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技能,的确可以在面试时候小小的装下比了

0 0
原创粉丝点击