JAVA数据结构双向链表

仅作为个人学习记录~

双向链表和单向链表的最大差别就是在插入和删除操作的时候要考虑头尾结点是否为空。

package basic.practic;

public interface MyList {
    public int getSize();
    public boolean isEmpty();
    public void insert(int i,Object e);
    public boolean contains(Object obj);
    public int indexOf(Object o);
    public Object remove(Object o);
    public Object remove(int i);
    public Object get(int i);
    public Object replace(int i,Object o);
    public boolean insertBefore(Object p,Object e);
    public boolean insertAfter(Object p,Object e);
}
package basic.practic;

public class MydoubleLink implements MyList{
    private Node first;//指向头结点
    private Node last;//指向尾结点
    private int size=0;//保存元素的个数

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public void insert(int i, Object e) {
        if(i<0||i>size){
            throw new IndexOutOfBoundsException("越界!");
        }
        if(i==0){
            addFirst(e);
        }
        else if(i==size){
            addLast(e);
        }else{
//            找到i结点,在i结点的前面插入元素
            Node pnode=getNode(i);
            Node prevNode=pnode.prev;
            Node newnode=new Node(e,prevNode,pnode);
            prevNode.next=newnode;
            pnode.prev=newnode;
            size++;
        }
    }

    private Node getNode(int i) {
        Node pnode=first;
        if(i<0||i>=size){
            throw new IndexOutOfBoundsException("越界");
        }
        for(int j=0;j<i;j++){
            pnode=pnode.next;
        }
        return pnode;
    }

    private void addLast(Object e) {
        Node lnode=last;
        Node newnode = new Node(e,last,null);
        if(lnode==null){
            first=newnode;
        }else{
            lnode.next=newnode;
        }
        last=newnode;
        size++;
    }

    private void addFirst(Object e) {
        Node pnode=first;
        Node newnode=new Node(e,null,first);
        first=newnode;
        if(pnode==null){
            last=newnode;
        }else{
            pnode.prev=newnode;
        }
        size++;
    }

    @Override
    public boolean contains(Object obj) {
        return indexOf(obj)>=0;
    }

    @Override
    public int indexOf(Object o) {
        Node pnode=first;
        if(size==0){
            throw new RuntimeException("链表为空!");
        }
        for(int i=0;i<size;i++){
            if(o==null){
                if(pnode.data==null){
                    return i;
                }
            }else{
                if(o.equals(pnode.data)){
                    return i;
                }
            }
            pnode=pnode.next;
        }
        return -1;
    }

    @Override
    public Object remove(Object o) {
        return remove(indexOf(o));
    }

    @Override
    public Object remove(int i) {
        Node pnode =first;
        if(i<0||i>=size){
            throw new IndexOutOfBoundsException("越界");
        }
        for(int j=0;j<i;j++){
            pnode=pnode.next;
        }
        Object old=pnode.data;
        Node p1=pnode.prev;
        Node p2=pnode.next;

        if(p1==null){//删除的是头结点,要判断头结点是不是null
            first=p2;
        }else {
            p1.next = p2;

        }
        if(p2==null){//删除的是尾结点,要判断尾结点是不是null
            last=p1;
        }else{
            p2.prev = p1;
        }
        size--;
        return old;
    }

    @Override
    public Object get(int i) {
        Node pnode=first;
        if(i<0||i>=size){
            throw new IndexOutOfBoundsException("越界");
        }
        for(int j=0;j<i;j++){
            pnode=pnode.next;
        }
        Object old=pnode.data;
        return old;
    }


    @Override
    public Object replace(int i, Object o) {
        if(i<0||i>=size){
            throw new IndexOutOfBoundsException("越界");
        }
        Node newnode=getNode(i);
        newnode.data=o;
        return newnode.data;
    }

    @Override
    public boolean insertBefore(Object p, Object e) {
        if(contains(p)){
            insert(indexOf(p),e);
            return true;
        }
        return false;
    }

    @Override
    public boolean insertAfter(Object p, Object e) {
        if(contains(p)){
            insert(indexOf(p)+1,e);
            return true;
        }
        return false;
    }


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

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

/*    public void show(){
        if(isEmpty()){
            return;
        }
        Node pnode=first;
        while(pnode!=null){
            System.out.print(pnode.data);
            System.out.print(" ");
            pnode=pnode.next;
        }
    }*/

    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("[");
        Node pnode=first;
        while(pnode!=null){
            sb.append(pnode.data);
            if(pnode.next!=null){
                sb.append(",");
            }
            pnode=pnode.next;
        }
        sb.append("]");
        return sb.toString();
    }
}
package basic.practic;

public class MydoubleLinkTest {
    public static void main(String[] args) {
        MydoubleLink t =new MydoubleLink();
        System.out.println(t.getSize());//0
        System.out.println(t.isEmpty());//true

        t.insert(0,"aa");
        t.insert(1,"bb");
        t.insert(2,"cc");
        t.insert(2,"dd");

        System.out.println(t.getSize());//4
        System.out.println(t);//[aa,bb,cc,dd]

//        t.show();
        System.out.println(t.contains("aa"));//true
        System.out.println(t.contains("ee"));//false

        System.out.println(t.remove(2));//dd
        System.out.println(t);//[aa,bb,cc]

        System.out.println(t.get(2));//cc
        System.out.println(t.replace(2,"AA"));//AA
        System.out.println(t);//[aa,bb,AA]

        System.out.println(t.insertBefore("bb","BB"));//true
        System.out.println(t);//[aa,BB,bb,AA]
        System.out.println(t.insertAfter("bb","BB"));//true
        System.out.println(t);//[aa,BB,bb,BB,AA]

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值