单向链表的缺点
1)单向链表,查找的方向只能是一个方向,而双向链表可以向前或向后查找
2)单向链表不能自我删除,需要借助辅助变量,而双向链表可以自我删除

双向链表的增删改、遍历的操作思路
1)添加节点(默认添加到双向链表的最后)
1.先找到双向链表的最后节点
2.temp.next=newHero(temp为辅助节点)
3.newHero.pre=temp

2)删除节点
1.直接找到要删除的这个节点,比如temp
2.temp.pre.next=temp.next
3.temp.next.pre=temp.pre

3)修改节点
1.根据节点的某个属性(比如编号 no)来找到目标节点
2.修改该节点其他数据

4)遍历
思路跟单链表一样,只是可以向前,也可以向后查找

单链表方法

双向链表的代码实现

public class DoubleLinkedList {
    //初始化头节点head,头节点不能动,不存放任何数据
    private User head=new User(0,"","");
    //添加节点到链表最后
    public void add(User user){
        //由于头节点不能动,因此需要一个辅助变量temp
        User temp=head;
        while(true){
            if(temp.next==null){
                //到达链表最后
                break;
            }
            //如果没有到最后,继续将temp后移
            temp=temp.next;
        }
        //当推出while循环时,表明temp指向链表最后一个节点
        temp.next=user;
        user.pre=temp;
    }

    //删除节点
    //传一个用户名过来,根据用户名是否匹配来删除节点
    public void del(String name){
        //先判断是否为空链表
        if(head.next==null){
            System.out.println("该链表为空,没有数据可删");
            return;
        }
        User temp=head.next;
        boolean flag=false;//标志是否找到待删节点
        while(true){
            if(temp==null){
                //表明链表到最后了
                break;
            }
            if(temp.name.equals(name)){
                //找到待删除节点
                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("要删除名字为:"+name+"节点不存在");
        }
    }

    //修改节点数据
    public void update(User newUser){
        //判断是否为空链表
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        //根据name找到需修改的节点
        User temp=head.next;
        boolean flag=false;//标志是否找到待修改节点
        while(true){
            if(temp==null){
                //链表已到最后
                break;
            }
            if(temp.name.equals(newUser.name)){
                //找到待修改节点了
                flag=true;
                break;
            }
            temp=temp.next;//后移,遍历
        }
        if(flag){
            //修改该节点内容
            temp.age=newUser.age;
            temp.password=newUser.password;
        }else{
            System.out.println("没有找到名字为:"+newUser.name+"的节点,不能修改");
        }
    }

    //遍历
    public void show(){
        //判断是否为空链表
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        User temp=head.next;
        while(true){
            if(temp==null){
                //链表到最后了
                break;
            }
            //输出节点内容
            System.out.println(temp);
            temp=temp.next;//后移,遍历
        }
    }
}

定义一个User类

//定义一个User类,每个User对象为一个节点
class User{
    public int age;
    public String name;
    public String password;
    public User next;//指向下一个节点
    public User pre;//指向前一个节点

    public User(int age,String name,String password){
        this.age=age;
        this.name=name;
        this.password=password;
    }

    //重写toString方法
    public String toString(){
        return "User[age="+age+"name="+name+"password="+password+"]";
    }
}