双链表实现——Java

链表的产生:保存多个对象,对象数组,但数组一旦定义长度固定---->链表

链表:插入删除:O(1)     随机访问:O(n)

数组:插入删除:O(n)      随机访问:O(1)

双向链表:

            Node类:负责结点内容的设置,真实保存内容

                link类:负责结点(处理Node类之间的关系)之间的动态挂载,用户使用的是link类

用户只需要通过Link类的add方法设置数据。link.add("数据"),对用户屏蔽了挂载操作

interface Ilink{
    /**
     * 链表的增加结点操作
     * @param data  节点内容
     * @return
     */
    boolean add(Object data);

    /**
     * 删除指定内容结点
     * @param data 结点内容
     * @return   返回删除的节点内容
     */
    Object remove(Object data);

    /**
     * 根据下标删除结点
     * @param index  指定的下标
     * @return
     */
    Object remove(int index);

    /**
     * 根据指定下标返回结点内容
     * @param index  指定下标
     * @return
     */

    /**
     * 清空链表
     */
    void removeAll();

    Object get(int index);

    /**
     * 根据结点内容判断指定的结点是否存在
     * @param data   结点内容
     * @return 返回结点内容所在的下标
     */
    int contains(Object data);

    /**
     * 根据指定下标修改结点内容
     * @param data   要修改的内容
     * @return   返回替换之前的结点
     */
    Object set(Object data,int index);

    /**
     * 将链表转为数组
     * @return 返回数组
     */
    Object[] toArray();

    /**
     * 取得链表长度
     * @return
     */
    int size();

    /**
     * 打印链表
     */
    void printLink();
}


class Link implements Ilink{
    private Node head;
    private Node last;
    private int size;

    private class Node{
        private Object data;
        private Node prev;
        private Node next;

        public Node(Object data, Node prev, Node next) {
            this.data = data;
            this.prev = prev;
            this.next = next;
        }
    }

    public Node getHead() {
        return head;
    }



    public Node getLast() {
        return last;
    }


    @Override
    public boolean add(Object data) {
        Node node = new Node(data,this.last,null);
        if(this.last!=null){
            this.last.next = node;
        }
        this.last = node;
        size++;
        if(this.head==null){
            this.head = node;
        }
        return true;
    }

    @Override
    public Object remove(Object data) {
        Object old = null;
        if(data==null){
            for(Node node = head;node!=null;node=node.next) {
                if(node.data==null){
                    old = node.data;
                    del(node);
                }
            }
            return old;
        }else{
            for(Node node = head;node!=null;node=node.next) {
                if(node.data==data){
                    old = node.data;
                    del(node);
                }
            }
            return old;
        }

    }
    private void del(Node node){
        if(node == null){
            return;
        }
        if(node==this.head){
            this.head = node.next;
        }else{
            node.prev.next = node.next;
        }
        if(node==this.last){
            this.last = node.prev;
        }else{
            node.next.prev = node.prev;
        }
        node.data = node.prev = node.next = null;
        node = null;
        size--;
    }

    @Override
    public Object remove(int index) {
        if(isIndex(index)){
            int i = 0;
            Object old = null;
            for(Node node = head;node!=null;node=node.next) {
               if(i==index){
                   old = node.data;
                   del(node);
               }
                i++;
            }
            return old;
        }
        return null;
    }

    @Override
    public void removeAll() {
        if(this.size==0){
            return ;
        }
        for(Node node = head;node!=null;) {
            Node temp = node.next;
            node.data = node.prev = node.next = null;
            node = null;
            node = temp;
            size--;
        }
        this.head = null;
        this.last = null;
    }

    public boolean isIndex(int index){
        return (index>=0&&index<this.size);
    }

    @Override
    public Object get(int index) {
        if(isIndex(index)){
            int i = 0;
            for(Node node = head;node!=null;node=node.next) {
                if(i==index){
                    return node.data;
                }
                i++;
            }
        }
        return null;
    }

    @Override
    public int contains(Object data) {
        int i  = 0;
        if(data==null){
            for(Node node = head;node!=null;node=node.next) {
                if(node.data==null){
                    return i;
                }
                i++;
            }
        }else{
            for(Node node = head;node!=null;node=node.next) {
                if(node.data==data){
                    return i;
                }
                i++;
            }
        }
        return -1;
    }

    @Override
    public Object set(Object data,int index) {
        if(isIndex(index)){
            int i = 0;
            Object oldData = null;
            for(Node node = head;node!=null;node=node.next){
                if(i==index){
                    oldData = node.data;
                    node.data = data;
                }
                i++;
            }
            return oldData;
        }
        return null;
    }

    @Override
    public Object[] toArray() {
        Object[] arr = new Object[this.size];
        int i = 0;
        for(Node node = head;node!=null;node=node.next){
            arr[i] = node.data;
            i++;
        }
        return arr;
    }

    @Override
    public int size() {
        return this.size;
    }

    @Override
    public void printLink() {
        for(Node node = head;node!=null;node=node.next){
            System.out.print(node.data+"——>");
        }
        System.out.println();
    }
}

public class Test {
    public static void main(String[] args) {
        Ilink link = new Link();
        link.add("火车头");
        link.remove(0);
        link.add("车厢1");
        link.add("车厢2");
        link.add("车厢3");
        link.add("车厢4");
        link.add("车厢5");
        link.add("车厢6");
        link.add("车厢尾");
        link.printLink();
        System.out.println(link.remove(0));
        System.out.println(link.remove("车厢尾"));
        System.out.println(link.set("hah",3));
        System.out.println(link.contains("hah"));
        System.out.println(link.toArray());
        link.printLink();
        System.out.println(((Link) link).getHead());
        System.out.println(((Link) link).getLast());
        link.removeAll();
        System.out.println(link.size());


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值