数据结构-双向链表(二)(Java版)

 

目录

1,什么是双向链表?

2,双向链表的实现

2.1,双向链表的节点类型

 2.2,双向链表的实现

2.2.1,定义一个双向链表

2.2.2,向双向链表的末尾插入一个元素

2.2.3,向双向链表的头添加一个元素

2.2.4,根据索引向双向链表中任意一个位置插入一个元素

2.2.5,根据元素值删除双向链表中的一个节点

2.2.6,遍历双向链表

3,测试代码


1,什么是双向链表?

双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针。所以在双向链表中的结点都有两个指针域:一个指向直接后继,一个指向直接前驱。这样在链表的任何一个节点,都可以访问到其前驱结点和后继节点。

2,双向链表的实现

2.1,双向链表的节点类型

class DoubleNode{
    private int data;
    public DoubleNode next;//下一个节点,默认为null
    public DoubleNode pre;//前一个节点,默认是null

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

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

 2.2,双向链表的实现

2.2.1,定义一个双向链表

class DoubleLinkedList{
    //初始化一个头结点
    private DoubleNode head=new DoubleNode(0);

    public DoubleNode getDoubleNode() {
        return head;
    }
}

2.2.2,向双向链表的末尾插入一个元素

/**
     * 向双向链表中添加元素,尾插法
     * @param doubleNode 双向链表的一个节点
     */
    public void add(DoubleNode doubleNode){
        DoubleNode doubleNode1=this.head;
        while (doubleNode1.next != null){
            doubleNode1=doubleNode1.next;
        }
//        退出循环,说明此时doubleNode1指针到双向链表的尾部
        doubleNode1.next=doubleNode;
        doubleNode.pre=doubleNode1;
    }

2.2.3,向双向链表的头添加一个元素

 /**
     * 向双向链表中添加节点,头插法
     * @param doubleNode 节点
     */
    public void addHead(DoubleNode doubleNode){
        DoubleNode doubleNode1=head.next;
        if(doubleNode1 == null){
            //说明此链表只有头结点的空链表
            this.head.next=doubleNode;
            doubleNode.pre=head;
        }else {
            head.next=doubleNode;
            doubleNode.pre=head;
            doubleNode.next=doubleNode1;
            doubleNode1.pre=doubleNode;
        }
    }

2.2.4,根据索引向双向链表中任意一个位置插入一个元素

  • 首先来看一下如何向双向链表中添加一个节点:

  • 代码实现: 
 /**
     * 根据索引向链双向链表中添加一个元素
     * @param index 添加元素的位置,默认不算头结点
     * @param doubleNode 需要插入链表的元素
     * @return 添加成功返回true,否则返回false
     */
    public boolean addOfIndex(int index ,DoubleNode doubleNode){
        DoubleNode doubleNode1=head.next;
        int k=0;
        while (doubleNode1 !=null){
            k++;
            if(k == index)
                break;
            doubleNode1=doubleNode1.next;
        }
        if(k == index){
            doubleNode1.pre.next=doubleNode;
            doubleNode1.pre=doubleNode;
            doubleNode.pre=doubleNode.pre;
            doubleNode.next=doubleNode1;
            return true;
        }else {
            System.out.println("输入位置不合法!");
            return false;
        }
    }

2.2.5,根据元素值删除双向链表中的一个节点

  • 先来看看如何在双向链表中删除一个节点:

  • 代码实现: 
/**
     * 删除双向链表中的一个元素,根据值删除
     * @param value 要删除的值
     */
    public void deleteDoubleLinked(int value){
        DoubleNode doubleNode=this.head.next;
        if(doubleNode == null)
            return;
        while (doubleNode.getData() != value)
            doubleNode = doubleNode.next;
        if(doubleNode.next == null){
            doubleNode.pre.next=null;
        }else {
            doubleNode.pre.next=doubleNode.next;
            doubleNode.next.pre=doubleNode.pre;
        }
    }

2.2.6,遍历双向链表

 /**
     * 遍历双向链表
     */
    public void printDoubleLinkedList(){
        DoubleNode doubleNode=this.head.next;
        while (doubleNode != null){
            System.out.print(doubleNode.getData()+" ");
            doubleNode=doubleNode.next;
        }
    }

3,测试代码

public class DoubleLinkedListDemo {
    public static void main(String[] args) {
    DoubleLinkedList doubleLinkedList=new DoubleLinkedList();
//    尾插法
    doubleLinkedList.add(new DoubleNode(1));
    doubleLinkedList.add(new DoubleNode(2));
    doubleLinkedList.add(new DoubleNode(3));
    doubleLinkedList.add(new DoubleNode(4));
    doubleLinkedList.add(new DoubleNode(5));
//        头插法
//        doubleLinkedList.addHead(new DoubleNode(1));
//        doubleLinkedList.addHead(new DoubleNode(2));
//        doubleLinkedList.addHead(new DoubleNode(3));
//        doubleLinkedList.addHead(new DoubleNode(4));
//        doubleLinkedList.addHead(new DoubleNode(5));
        删除链表中的元素
        doubleLinkedList.deleteDoubleLinked(5);
        doubleLinkedList.deleteDoubleLinked(1);
        doubleLinkedList.addOfIndex(5,new DoubleNode(199));
        doubleLinkedList.printDoubleLinkedList();
    }
}
  •  结果展示


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值