java實現雙向連結串列

qq_40179688發表於2020-10-05

之前分析了單連結串列的增刪改查操作,雙連結串列操作只是在此基礎上稍微修改一下,可以作圖輔助分析,這裡直接上完整的程式碼。測試某個函式功能直接呼叫就行。新加了一個findforwardnode函式可以查詢當前節點的前一個節點,可以測試是否是雙向連結串列。

package com.linear.test;

/**
 * @author ymm
 * @create 2020-10-05 19:31
 */
public class DoubleLinkList {
    public static void main(String []args)
    {
        Doublelist list = new Doublelist();
        HeroNode2 link1=new HeroNode2(1,"宋江","及時雨");
        HeroNode2 link2=new HeroNode2(2,"盧俊義","玉麒麟");
        HeroNode2 link3=new HeroNode2(3,"吳用","智多星");
        HeroNode2 link4=new HeroNode2(4,"林沖","豹子頭");
        HeroNode2 link5=new HeroNode2(1,"lingchong","baozitou");
        list.AddByOrder(link1);
        list.AddByOrder(link4);
        list.AddByOrder(link3);
        list.AddByOrder(link2);
        //list.update(link5);
        list.travel();

    }
}


class Doublelist{
    HeroNode2 head = new HeroNode2(0,"","");
    //尾插連結串列,測試成功不報錯
    public void AddInTail(HeroNode2 newNode)
    {
        HeroNode2 temp=head;
        while(temp.next!=null)
        {
            if(temp.heronum== newNode.heronum)
            {
                System.out.println("節點已經存在。不可重複插入\n");
                return;
            }
            temp=temp.next;
        }
        temp.next=newNode;
        newNode.pre=temp;
        newNode.next=null;
    }
    //頭插雙連結串列,查詢重複插入還是要遍歷連結串列
    public void AddInHead(HeroNode2 newNode)
    {
        if(head.next==null) //插入第一個節點時
        {
            head.next=newNode;
            newNode.pre=head;
        }
        //不只一個節點時
        else
        {
            newNode.next=head.next;
            head.next.pre=newNode;
            head.next=newNode;
            newNode.pre=head;
        }

    }
    //編號順序插入,不同於單連結串列,可以直接定位到帶插入位置處,因為可以雙向連結串列可以找到前一個節點
    public void AddByOrder(HeroNode2 newNode)
    {
        HeroNode2 temp=head;
        boolean flag=false;
        while(true)
        {
            //這裡如果是1>4,現在插入3就不對,因為滿足第一條件,還是要找前一個節點輔助
            if(temp.next==null)   //遍歷到頭就尾插
            {
               temp.next=newNode;
               newNode.pre=temp;
               flag=true;
            }
            if(temp.next.heronum> newNode.heronum)   //找到位置節點,在節點之前的位置插入就可,和單連結串列相似就是沒想出來
            {
                newNode.next=temp.next;
                temp.next.pre=newNode;
                temp.next=newNode;
                newNode.pre=temp;
                flag=true;
            }
            if(temp.heronum==newNode.heronum)
            {
                System.out.print("節點已經存在,不可插入\n");
            }
            temp=temp.next;
            if(flag)
                return;
        }
    }


    //測試一下是否是雙連結串列,測試成功,可以找到前一個節點
    public void findforwardnode(int number)
    {
        HeroNode2 temp = head.next;
        while(temp!=null)
        {
            if(temp.heronum==number)
            {
                System.out.print("前一個節點為");
                System.out.println(temp.pre);
                return ;
            }
            temp=temp.next;
        }
        System.out.print("找不到對應的節點\n");
    }

    //遍歷連結串列
    public void travel() {
        if (head.next == null) {
            System.out.print("連結串列為空\n");
            return;
        }
        else {
            HeroNode2 temp = head.next;
            while (temp != null) {
                System.out.println(temp);
                temp = temp.next;
            }
        }
    }
    //按照編號刪除節點,測試成功
    public void delete(int number)
    {
        HeroNode2 temp=head;
        boolean flag=false;
        while(temp!=null)
        {
            if(temp.heronum==number)
            {
                if(temp.next==null)  //最後一個節點比較特殊
                temp.pre.next=temp.next;
                else
                {
                    temp.pre.next=temp.next;
                    temp.next.pre=temp.pre;
                }
                flag=true;
            }
            temp=temp.next;
            if(flag)
                return ;
        }
        System.out.print("刪除節點編號不存在\n");
        return ;
    }

    //按序號更新資訊,和刪除類似,編號不能更改
    public void update(HeroNode2 newNode)
    {
        HeroNode2 temp = head.next;
        while(true)
        {
            if(temp==null)
            {
                System.out.print("待更新的節點找不到\n");
                return ;
            }
            if(temp.heronum==newNode.heronum)
            {
                temp.heroname=newNode.heroname;
                temp.heroNickName=newNode.heroNickName;
                return;
            }
            temp=temp.next;
        }
    }

}




//定義雙連結串列節點結構
class HeroNode2{
    int heronum;
    String heroname;
    String heroNickName;
    HeroNode2 next;
    HeroNode2 pre;
    public HeroNode2(int heronum,String heroname,String hreoNickName)
    {
        this.heronum=heronum;
        this.heroname=heroname;
        this.heroNickName=hreoNickName;
    }
    @Override
    public String toString() {
        return " [heronum=" + heronum + ", heroname=" + heroname + ", heroNickName=" + heroNickName + "]";
    }
}

相關文章