数据结构链表之双向链表

一、双向链表介绍

  双链是双向的,每一个节点内都存放了数据、下一个节点的地址next、上一个节点的地址prev    

  双链表比单链表多了一个prev用来存放上一个节点的地址.

  结构如下图:

二、双链表对比单链表分析

    1)单链表只能向后查找,而双链表可以向前向后查找。

    2)单链表节点不能自我删除,需要找到待删除节点的前一个节点,而双向链表可以自我删除。

三、双链表的创建和增删改查

    1)创建节点Node和双链表类DoubleLinkedList

class Node03{
    public int data;
    public Node03 next;//指向下一个节点,next内存储的是下一个节点的引用(地址),节点为Node03型,所以next也应该是Node03
    public Node03 prev;//指向前一个节点

    public Node03(int data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Node03{" +
                "data=" + data +
                '}';
    }
}


class DoubleLinkedList{
    //这个类里写增删改查方法
}

    2)添加节点到双链表

 //先创建一个head头节点,不存放数据
    public Node03 head = new Node03(0);

    //添加节点到双链表,不考虑data顺序时,下面是尾插法
    //1.找到当前双链表的最后节点
    //2.让最后节点的next指向新的节点,prev指向原来找到的最后节点
    public void add(Node03 node03){
        //head节点不能动,所以需要一个辅助变量temp
        Node03 temp = head;
        //遍历链表,找到尾节点
        while (true){
            //找到尾节点
            if ( temp.next == null){
                break;
            }
            //没找到的话就接着往后找,让temp后移
            temp = temp.next;
        }
        //当退出while后,temp就指向最后节点
        //将最后这个节点的next指向新的节点
        temp.next = node03;
        node03.prev = temp;
    }

 3)删除节点

1.遍历链表找到要删除的节点temp
2.让temp的前一个节点指向temp的下一个节点temp.prev.next=temp.next
3.让temp的下一个节点的prev换成temp的上一个节点temp.next.prev=temp.prev

//删除节点
    //1.遍历链表找到要删除的节点temp
    //2.让temp的前一个节点指向temp的下一个节点temp.prev.next=temp.next
    //3.让temp的下一个节点的prev换成temp的上一个节点temp.next.prev=temp.prev
    public void deleteNode(int key){
        Node03 temp = this.head;
        while (temp != null){
            if(temp.data == key){
                temp.prev.next = temp.next;
                temp.next.prev = temp.prev;//这两部完成该节点得删除
                temp = temp.next;//temp后移,继续找要删除的节点
            }else {
                temp = temp.next;//不相等就直接往后找
            }
        }
        if(this.head.data==key) {//最后考虑头节点,如果相等再完成删除
            this.head = this.head.next;
            this.head.next.prev = this.head;
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值