Java数据结构与算法——双向链表 思路分析

双向链表

这是一个java的双向链表的代码实现,这里简单实现了双向链表的节点创建(不同与单链表的时多了一个指向上一个节点的指针),双向链表的建立,节点的添加,链表的遍历,节点的修改,节点删除。
代码中还包括双向链表的各个功能的测试。

public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        System.out.println("双向链表的测试!!!");
        HeroNode2 hero1 = new HeroNode2(1,"宋江","及时雨");
        HeroNode2 hero2 = new HeroNode2(2,"卢俊义","玉麒麟");
        HeroNode2 hero3 = new HeroNode2(3,"吴用","智多星");

        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();//首先先创建一个双向链表
        doubleLinkedList.add(hero1);
        doubleLinkedList.add(hero2);
        doubleLinkedList.add(hero3);

        doubleLinkedList.list();
        HeroNode2 hero9 = new HeroNode2(3,"大吴用","小智多星");

        doubleLinkedList.update(hero9);
        System.out.println("显示修改后的双向链表。");
        doubleLinkedList.list();
        doubleLinkedList.del(5);
        System.out.println("显示删除后的双向链表。");
        doubleLinkedList.list();

    }
}
class DoubleLinkedList{
    private HeroNode2 head = new HeroNode2(0,"","");
    public HeroNode2 getHead() {
        return head;
    }
    //遍历双向链表
    public void list(){
        if (head.next == null){
            return ;
        }
        HeroNode2 temp =  head.next;
        while(true){//是否到最后
            if (temp == null){
                break;
            }
            System.out.println(temp);
            temp=temp.next;
        }
    }

    //双向链表添加节点到最后
    public void add(HeroNode2 heroNode2){

        HeroNode2 temp = head;//因为head节点不能动,因此需要一个辅助遍历temp
        while(true){//找到链表最后
            if(temp.next == null){
                break;
            }
            temp=temp.next;     //没找到 temp后移
        }
        //当退出while时 temp指向最后
        //将最后这个节点的next,指向新节点
        temp.next = heroNode2;
        heroNode2.pre = temp;
    }
    //双向链表修改节点
    public  void  update(HeroNode2 newHeroNode2){
        if (head.next == null){    //判空。
            System.out.printf("链表为空。。。、\n");
            return;
        }
        //找到需要修改的节点
        HeroNode2 temp = head.next;
        boolean flag = false;
        while(true){
            if (temp == null){
                break;//遍历完成。
            }
            if (newHeroNode2.no == temp.no)
            {
                flag = true;
                break;
            }else temp=temp.next;
        }
        //根据flag判断是否找到
        if (flag)
        {
            temp.name = newHeroNode2.name;
            temp.nickname = newHeroNode2.nickname;
        }else {
            System.out.printf("没有找到。。编号%d",newHeroNode2.no);
        }
    }
    //删除
    public void del(int no){
        if (head.next == null){
            System.out.println("kong!!");
            return;
        }
        HeroNode2 temp=head;//辅助节点
        boolean flag = false;

        while(true){
            if (temp == null){
                break;
            }
            if (temp.no == no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.pre.next = temp.next;
            if (temp.next != null){//这里必须加这一步,否则删除最后节点时,会出现空指针异常。
                temp.next.pre = temp.pre;
            }
        }else {
            System.out.printf("要删除节点%%d不存在!!!、\n",no);
        }
    }

}
class  HeroNode2 {//创建HeroNode2节点
    public int no;
    public String name;
    public String  nickname;
    public HeroNode2 next;
    public HeroNode2 pre;// 指向上一个节点,默认null;
    public HeroNode2(int no,String name,String nickname){
        this.no = no;
        this.name = name;
        this.nickname = nickname;
        }
public String toString(){
        return "HeroNode[ no="+ no + ", name ="+ name +", nickname ="+nickname+".]";
        }
        }

你可能感兴趣的:(Java数据结构与算法——双向链表 思路分析)