Java实现双向链表

package Test;

import java.util.Currency;

import javax.management.loading.PrivateClassLoader;
import javax.print.attribute.Size2DSyntax;
import javax.xml.soap.Node;
import javax.xml.transform.Templates;

interface Link{
    void add(Object obj);
    boolean remove(int index);
    boolean contains(Object obj);
    int indexOf(Object obj);
    boolean set(int index,Object obj);
    Object get(int index);
    int length();
    void clear();
    Object[] toArray();
    void printLink();
}
class Factory{
    private Factory(){}
    public static Link getLinkInstance() {
        return new LinkImpl();
    }
}
class LinkImpl implements Link{
    private int size = 0;
    private Node first;
    private Node last;
    public Node getFirst() {
        return first;
    }
    public void setFirst(Node first) {
        this.first = first;
    }
    public Node getLast() {
        return last;
    }
    public void setLast(Node last) {
        this.last = last;
    }
    public class Node{
        private Node prev;
        private Object data;
        private Node next;
        private Node(Node prev,Object data,Node next){
            this.prev = prev;
            this.data = data;
            this.next = next;
        }
    }

    public void add(Object obj) {
        Node cur = this.last;
        Node newNode = new Node(cur, obj, null);
        if(cur == null) {
            this.first = newNode;
        }else {
        this.last = newNode;
        newNode.prev = cur;
        cur.next = newNode;
        }
        ++size;
    }
    public boolean remove(int index) {
        //按下标删除元素
        if(!((index<0)&&(index>size))) {
            return false;
        }
        else {
            Node node = node(index);

            Node temp = node.prev;
            temp.next = node.next;
            node.next.prev = temp;

            node.next = null;
            node.prev = null;

            return true;
        }

    }

    private Node node(int index) {
        if(!((index<0)&&(index>size))) {
            return null;
        }

            Node temp = this.first;
            int i = 0;
            while(temp != null) {
                temp = temp.next;
                ++i;
                if(i == index) {
                    break;
                }
            }
            return temp;


    }
    public boolean contains(Object obj) {
        //判断值是否存在
        Node temp = this.first;
        for(; temp != null; temp = temp.next) {
            if(temp == obj) {
                return true;
            }
        }
        return false;   
    }
    public int indexOf(Object obj) {
        //按照元素获取下标
        Node temp = this.first;
        while(obj != temp.data) {
            temp = temp.next;
        }
        return size;
    }
    public boolean set(int index,Object obj) {
        //按下标替换元素
        if(!((index<0)&&(index>size))) {
            return false;
        }
        Node node = node(index);
        node.data = obj;
        return true;
    }
    public Object get(int index) {
        //按照下标获取值

        int i = 0;
        Node temp = this.first;
        for(; temp != null; temp = temp.next) {
            if(i == index) {
                return temp.data;
            }
            ++i;
        }
        return false;   
    }
    public int length() {
        //链表长度
        return this.size;
    }
    public void clear() {
        //清除链表
        Node temp = this.first;

        while(temp != null) {
            Node cur = temp.next;
            temp.prev = null;
            temp.data = null;
            temp.next = null;
            temp = cur;
            size--;
        }
        this.first = this.last = null;
    }
    public Object[] toArray() {    
        Object[] value = new Object[size];
        int i = 0;
        Node temp = this.first;
        for(; temp != null; temp = temp.next) {
            value[i++] = temp.data;
        }
        return value;
    }
    public void printLink() {
        Object[] result = this.toArray();
        for (Object object : result) {
            System.out.println(object);
        }   
    }
}





public class Test06 {
    public static void main(String[] args) {
    Link link = Factory.getLinkInstance();
    link.add("火车头");
    link.add("车厢1");
    link.add("车厢2");
    link.add("火车尾");
    System.out.println(link.contains("车厢3"));
    System.out.println(link.indexOf("车厢2"));
    System.out.println(link.get(3));
    System.out.println(link.length());
    System.out.println(link.set(3, "车厢3"));
    System.out.println(link.get(3));
    link.clear();
    System.out.println(link.length());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值