双向循环链表

  1. 双向循环链表示意图:
    这里写图片描述
  2. 创建结点内部类
class Entry{
        int data;
        Entry next;
        Entry prio;

        public Entry(){
            this.data=-1;
            this.next=null;
            this.prio=null;
        }
        public Entry(int val){
            this.data=val;
            this.next=null;
            this.next=null;
        }
    }
  1. 头插法
public Entry head=null;//创建头结点
    public DoubleLink(){
        this.head=new Entry();
    }
    //头插法
    public void insertHead(int val){
        Entry entry=new Entry(val);//得到了一个结点
        entry.next=head.next;
        entry.prio=this.head;
        this.head.next=entry;
        if(entry.next!=null){//会有空指针异常,这个我还不懂
           entry.next.prio=entry;
        }
    }

输入:

DoubleLink t1=new DoubleLink();
        t1.insertHead(10);
        t1.insertHead(10);
        t1.insertHead(10);
        t1.show();

输出:
这里写图片描述
视图分析:
这里写图片描述
4. 尾插法

public void insertTail(int val){
        Entry cur=this.head;
        while(cur.next!=null){
            cur=cur.next;
        }
        Entry entry=new Entry(val);
        cur.next=entry;
        entry.prio=cur.next.prio;
    }

输入:

DoubleLink t1=new DoubleLink();
        t1.insertTail(6);
        t1.insertTail(66);
        t1.insertTail(666);
        t1.show();

输出:
这里写图片描述

视图分析:
这里写图片描述
5. 删除值为val的所有结点

public void deleteEntry(int val){
        Entry cur=this.head.next;
        while(cur!=null){
            if(cur.data==val){
                cur.prio.next=cur.next;
                if(cur.next!=null){//删除最后一个结点的时候
                    cur.next.prio=cur.prio;
            }
            }
            cur=cur.next;
        }
    }

输入:

DoubleLink t1=new DoubleLink();
        t1.insertTail(6);
        t1.insertTail(66);
        t1.insertTail(666);
        t1.show();
        t1.deleteEntry(66);
        t1.show();

输出:

视图分析:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xyxy66/article/details/80209712