双向链表

双向链表

双向链表具有两个方向;有next域指向后一个节点;pre域指向前一个节点

双向链表的优点

  • 单向链表,查找只能向一个方向;双向链表可以从前、后两个方向查找;
  • 单向链表不能自我删除,需要靠辅助节点;我们总是找删除节点的前一个节点;双向链表可以自我删除。

双向链表的增删改查

分析思路

添加节点:直接添加到链表的后面

  • ​ 找到链表的尾部,添加节点 temp.next=null

  • temp.next=N N.pre=temp;

删除节点:双向链表可以实现自我删除

  • 直接找到要删除的节点;
  • temp.pre.next=temp.next temp.next.pre=temp.pre;

修改节点:和单链表一样

查看节点:遍历方法和单向链表一样,方向可以向前也可以向后;

//代码实现
//双向链表
//创建节点
class Node2 {
    public String name;
    public int No;
    public Node2 next;//指向后面一个节点
    public Node2 pre;//指向前面一个节点

    public Node2() {
    }

    public Node2(String name, int no) {
        this.name = name;
        No = no;
    }
}

//创建双向链表管理
class DoubleList{
    //定义一个头节点
    private Node2 head=new Node2();
    //添加节点
   public void add3(Node2 N){
       Node2 temp = head;
       while(true){
           if(temp.next==null){//找到链表的末尾
              break;
           }
           temp=temp.next;
       }
       temp.next=N;
       N.pre=temp;
   }

   //删除指定节点
    public void de(int no) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Node2 temp = head.next;
        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.println("输入有无,无法删除");
        }
    }

    //修改节点信息
    public void change(Node2 N) {
        //判断链表是否为空
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        //找到要修改的节点,根据编号来修改
        //定义一个辅助变量
        Node2 temp=head.next;
        boolean flag=false;
        //遍历完找到要修改的节点
        while(true){
            if(temp==null){//找到链表的最后
                break;
            }
            if(N.No==temp.No){//找到要修改的链表
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            temp.name=N.name;
        }
        else{
            System.out.println("无法修改");
        }
    }

    //查看链表
    public void show() {
        //判断链表是否为空
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        Node2 temp=head.next;
        while(true){
            if(temp==null){
                break;
            }
            System.out.println(temp.No+"+"+temp.name);
            temp = temp.next;
        }

    }
}

posted @ 2020-12-29 18:59  胡木杨  阅读(168)  评论(0)    收藏  举报