双向链表及其各种操作

什么是双向链表:

我们都知道单向链表中的每一个节点有且只有一个指针,这个指针就是用来指向下一个节点的,单向链表顾名思义就是链表方向是单方向的,而本文要介绍的双向链表就是链表方向是双方向的,也就是双向链表中的每一个节点有两个指针,一个指针用来指向上一个节点(前驱),另一个指针用指向下一个节点(后继)。

这里写图片描述

双向链表各种操作

头插法这里写图片描述
代码实现

        public void inserthead(int val){
            Entry entry=new Entry(val);
            entry.next=this.head.next;
            entry.prio=this.head;
            this.head.next=entry;
            if(entry.next!=null){//没有判断的话,如果只有一个头结点的时候,会出现空指针异常,这个时候entry的后面是没有节点的,所以entry.next.prio是不存在的
                entry.next.prio=entry;
            }

尾插法:
这里写图片描述

//尾插法
        public void inserttail(int val){
            Entry entry=new Entry(val);
            Entry cur =this.head;
            while(cur.next!=null){
                cur=cur.next;
            }

            entry.prio=cur;
            cur.next=entry;


        }

全部代码块

class Testlink{
       Entry head;
      public    Testlink(){
          this. head=new Entry();
                 }
        class Entry{
        int data;
        Entry next;//后继
        Entry prio;//前驱
        public Entry(){
            this.data=-1;
            this.next=null;
            this.prio=null;

        }


        public Entry(int data){
            this.data=data;
            this.next=null;
            this.prio=null;

        }

    }
        //头插法  
        public void inserthead(int val){
            Entry entry=new Entry(val);
            entry.next=this.head.next;
            entry.prio=this.head;
            this.head.next=entry;
            if(entry.next!=null){//没有判断的话,如果只有一个头结点的时候,会出现空指针异常,这个时候entry的后面是没有节点的,所以entry.next.prio是不存在的
                entry.next.prio=entry;
            }
        }
        //打印
        public void show(){
            Entry cur=this.head.next;
            while(cur!=null){
                System.out.println("cur.data= "+cur.data+" ");
                cur=cur.next;
            }
        }
        //尾插法
        public void inserttail(int val){
            Entry entry=new Entry(val);
            Entry cur =this.head;
            while(cur.next!=null){
                cur=cur.next;
            }

            entry.prio=cur;
            cur.next=entry;


        }
        //删除val值
        public void delete(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;
            }


        }
    }


public class test2 {

    public static void main(String[] args) {
        Testlink t1= new Testlink();
      for (int i=0;i<6;i++){
          t1.inserttail(i);
      }
      t1.show();
      System.out.println("====删除5后====");
      t1.delete(5);     
      t1.show();
      System.out.println("====尾部插入2后====");
      t1.inserttail(2);
      t1.show();

        }


}

运行结果:
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4
cur.data= 5
====删除5后====
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4
====尾部插入2后====
cur.data= 0
cur.data= 1
cur.data= 2
cur.data= 3
cur.data= 4
cur.data= 2

猜你喜欢

转载自blog.csdn.net/qq_37232304/article/details/80209893