:链表 -- 双向链表

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:链表 -- 双向链表相关的知识,希望对你有一定的参考价值。

1. 双向链表


1.1 概念

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。


1.2 实例

BookNode.java

package data_structure;

public class BookNode 

    public int id;

    public String name;

    public double price;

    //节点下一个节点  直接后继
    public BookNode next;

    //上一个节点   直接前驱
    public BookNode pre;

    public BookNode(int id, String name, double price) 
        this.id = id;
        this.name = name;
        this.price = price;
    

    @Override
    public String toString() 
        return "BookNode" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", price=" + price +
                '';
    

DualLinkedList.java

package data_structure;

public class DualLinkedList 
    private final BookNode head = new BookNode(0, "", 0.0);

    /**
     * 添加结尾新的节点
     */
    public void addLast(BookNode newNode) 
        BookNode temp = head;

        while (temp.next != null) 

            //如果第一次进来则进入,表示双向链表是空数据

            temp = temp.next;
        
        /*
         * 需要把新的节点给上一个节点
         * 需要把上一个节点next指向新的节点
         */
        temp.next = newNode;
        newNode.pre = temp;


    

    /**
     * 修改节点
     * 条件:双向链表中的每一个结点的id和修改的id对比,如果对比成功,则进行修改该结点
     * ,如果没有对比成功,双向链表中未找到目标结点
     */
    public void updateNode(BookNode node) 
        //是否是空链表
        if (head.next == null) 
            System.out.println("空链表...");
            return;
        

        BookNode temp = head.next;

        boolean flg = false;
        while (true) 
            if (temp == null) 
                break;
            
            if (temp.id == node.id) 
                flg = true;
                break;
            
            temp = temp.next;
        
        if (flg) 
            temp.name = node.name;
            temp.price = node.price;
         else 
            System.out.println("未找到要修改的节点...");
        
    

    /**
     * 双向链表删除
     * 条件:根据id编号进行删除节点
     */
    public void delNode(int id) 
        if (head.next == null) 
            System.out.println("空链表...");
            return;
        

        BookNode temp = head.next;
        boolean flg = false;
        while (true) 
            if (temp == null) 
                break;
            
            if (temp.id == id) 
                flg = true;
                break;
            
            temp = temp.next;
        
        if (flg) 
            temp.pre.next = temp.next;
            if (temp.next != null) 
                temp.next.pre = temp.pre;
            
         else 
            System.out.println("未找到该结点...");
        
    

    public void list() 
        BookNode tempNode = head.next;
        while (tempNode != null) 
            System.out.println(tempNode.toString());
            tempNode = tempNode.next;
        
    

LinkedTest.java

package data_structure;

/**
 * @company: 北京动力节点
 * @author:韩国庆
 */
public class LinkedTest 

    public static void main(String[] args) 

        DualLinkedList dualLinkedList = new DualLinkedList();

        BookNode bookNode1 = new BookNode(1, "红楼梦", 66.00);
        BookNode bookNode2 = new BookNode(2, "西游记", 66.00);
        BookNode bookNode3 = new BookNode(3, "水浒传", 66.00);
        BookNode bookNode4 = new BookNode(4, "三国演义", 66.00);

        dualLinkedList.addLast(bookNode1);
        dualLinkedList.addLast(bookNode2);
        dualLinkedList.addLast(bookNode3);
        dualLinkedList.addLast(bookNode4);
        dualLinkedList.list();
        dualLinkedList.delNode(1);
        System.out.println("------------------------------------------");
        dualLinkedList.updateNode(new BookNode(3, "计算机", 66.00));
        dualLinkedList.list();
    


运行结果:



以上是关于:链表 -- 双向链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(链表——双向链表的实现)

带头节点的双向链表

双向链表的原理与实现

数据结构之带头结点的循环双向链表详细图片+文字讲解

Python数据结构与算法(2.4)——双向链表

双向链表