数据结构六 双向链表

1.双向链表在单向链表的基础上,增加了一个pre,用于记录一个节点前一个节点的信息。
2.双向链表既可以正向移动,又可以反向移动,因此做删除和增加元素时,不需要通过一个节点的上一个节点辅助,就可以进行

class StudentNode
{
    int no;
    String name;
    //存储上一个节点的信息;
    StudentNode pre;
    //存储下一个节点的信息
    StudentNode next;
    public StudentNode(int no, String name) {
        this.no = no;
        this.name = name;
    }

    @Override
    public String toString() {
        return "StudentNode{" +
                "no=" + no +
                ", name='" + name +
                '}';
    }
}
class DoubleLinkedList
{
    StudentNode head=new StudentNode(0,null);

    public void add(StudentNode studentNode)
    {
        StudentNode temp=head;
        while(temp.next!=null)
        {
            temp=temp.next;
        }
        temp.next=studentNode;
        studentNode.pre=temp;
    }
    public void all()
    {
        StudentNode temp=head.next;
        if(head.next==null)
        {
            System.out.println("链表为空!不能遍历!");
            return;
        }
        while(temp!=null)
        {
            System.out.println(temp);
            temp=temp.next;
        }
    }
    public void update(StudentNode studentNode)
    {
        StudentNode temp=head.next;
        boolean flag=false;
        if(head.next==null)
        {
            System.out.println("链表为空,不能修改");
            return;
        }
        while(temp!=null)
        {
            if(temp.no==studentNode.no)
            {
                System.out.println("编号为"+studentNode.no+"的节点修改成功!");
                temp.name=studentNode.name;
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(!flag){
            System.out.println("编号为"+studentNode.no+"的节点不存在!");
        }
    }
    public void delete(int no)
    {
        StudentNode temp=head;
        boolean flag=false;
        if(head.next==null)
        {
            System.out.println("链表为空,不能删除!");
            return;
        }
        while(temp!=null)
        {
            if(temp.no==no)
            {
                flag=true;
                temp.pre.next=temp.next;
                if(temp.next!=null)
                {
                    temp.next.pre=temp.pre;
                }
                System.out.println("编号为"+no+"的节点删除成功");
            }
            temp=temp.next;
        }
        if(!flag) {
            System.out.println("删除失败,编号为" + no + "的节点不存在!");
        }
    }
}
public class Test2 {
    public static void main(String[] args) {
        StudentNode studentNode1=new StudentNode(1,"郎云松1号");
        StudentNode studentNode2=new StudentNode(2,"郎云松2号");
        StudentNode studentNode3=new StudentNode(3,"郎云松3号");
        StudentNode studentNode5=new StudentNode(5,"郎云松5号");
        StudentNode studentNode4=new StudentNode(4,"郎云松4号");
        StudentNode studentNode7=new StudentNode(7,"郎云松7号");
        StudentNode studentNode6=new StudentNode(6,"郎云松6号");
        StudentNode studentNode8=new StudentNode(1,"郎云松1号修改测试");
        DoubleLinkedList d=new DoubleLinkedList();
        d.add(studentNode1);
        d.add(studentNode2);
        d.add(studentNode5);
        d.add(studentNode7);
        d.add(studentNode6);
        //测试双向链表是否能够双向查看数据
        System.out.println(d.head.next.next.pre);
        //测试修改结果
        d.update(studentNode8);
        //测试删除
        d.delete(6);
        System.out.println("以下为链表的遍历");
        d.all();
     }
}

运行结果

StudentNode{no=1, name='郎云松1}
编号为1的节点修改成功!
编号为6的节点删除成功
以下为链表的遍历
StudentNode{no=1, name='郎云松1号修改测试}
StudentNode{no=2, name='郎云松2}
StudentNode{no=5, name='郎云松5}
StudentNode{no=7, name='郎云松7}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值