双向链表java简单实现增删改

Posted 大树的困惑

tags:

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

双向链表java简单实现增删改

比起单向链表,双向链表基于节点Node 类多了一个可以追溯上一个节点的引用pre,多了这个引用针对删除增加等这些操作,都比较方便,这里记录一下简单的java实现过程

package DataStrct.linklist;

/**
 * @author luke
 * @date 2021/4/1819:32
 */
public class DoubleLinkelistDemo 
    public static void main(String[] args) 

        System.out.println("--------------尾插");
        DoubleLinklist doublelinklist = new DoubleLinklist(new Node(1, "第一"));
        doublelinklist.add(new Node(2, "第二"));
        doublelinklist.add(new Node(3, "第三"));
        doublelinklist.add(new Node(4, "第四"));

        doublelinklist.print_list();
        System.out.println("--------------头插");
        doublelinklist.headadd(new Node(7, "第七"));
        doublelinklist.headadd(new Node(8, "第八"));
        doublelinklist.headadd(new Node(9, "第九"));
        doublelinklist.print_list();
        System.out.println("--------------更新");
        doublelinklist.update(new Node(9, "更新第九"));
        doublelinklist.print_list();
        System.out.println("--------------删除");
        doublelinklist.del(9);
        doublelinklist.print_list();

    

    //节点类
    static class Node 
        int id;//节点id
        String data;//节点属性
        Node pre;//双向链表前一个节点
        Node next;//双向链表的下一个节点

        public Node(int id, String data) 
            this.id = id;
            this.data = data;
        

        @Override
        public String toString() 
            return "Node" +
                    "id=" + id +
                    ", data='" + data + '\\'' +
                    '';
        
    

    //双向链表
    static class DoubleLinklist 
        Node head;
        Node tail;

        public DoubleLinklist(Node head) 
            this.head = head;
            this.tail = head;
        

        /**
         * 1.添加节点add(尾插+头插)
         * 2.修改节点update
         * 3.删除节点del
         * 4.打印链表print
         */
        /**
         * 尾插
         *
         * @param node
         */
        public void add(Node node) 
            /**
             * 默认添加是重链表最后添加的
             */
            if (tail == null) 
                //当链表为空时
                head = node;
                tail = node;
                return;
            
            //将插入节点赋值给tail节点---tail节点的下个节点指向插入节点,插入节点的上个节点指向tail节点的上个节点
            tail.next = node;
            node.pre = tail;
            tail = node;//更新链表的尾部节点

        

        /**
         * 头插
         *
         * @param node
         */
        public void headadd(Node node) 
            if (head == null) 
                //当链表为空时
                head = node;
                tail = node;
                return;
            
            head.pre = node;
            node.next = head;
            head = node;
        

        /**
         * 更新
         *
         * @param node
         */
        public void update(Node node) 
            Node temp = head;
            //遍历链表
            while (true) 
                if (temp.next == null) 
                    //达到最后一个节点了
                    break;
                
                if (temp.id == node.id) 
                    break;
                
                temp = temp.next;
            
            temp.data = node.data;
        

        /**
         * 删除
         *
         * @param id
         */
        public void del(int id) 
            //更具id进行删除
            Node temp = head;
            //如果是空表直接返回
            if (head == null) 
                System.out.println("当前为空链表");
                return;
            
            while (true) 
                if (temp.next == null) 
                    break;//遍历到最后了
                
                if (temp.id == id) 
                    break;
                
                temp = temp.next;
            
            //删除操作,
            // 当前节点的上个节点的下个节点指向当前节点的下个节点
            // 当前节点的下个节点的上个节点指向当前节点的上个节点
            //当删除节点是头节点或者尾节点时需要特殊处理
            if (temp.id == head.id) 
                head=head.next;
                head.pre=null;
            
            else if (temp.id == tail.id) 
                tail = tail.pre;
                tail.next = null;
            
            else 
                temp.pre.next=temp.next;
                temp.next.pre=temp.pre;
            

        

        /**
         * 打印链表
         */
        public void print_list() 
            //遍历链表
            Node tempnode = head;
            while (true) 
                if (tempnode.next == null) 
                    break;
                
                System.out.println(tempnode);
                tempnode = tempnode.next;
            
        
    


以上是关于双向链表java简单实现增删改的主要内容,如果未能解决你的问题,请参考以下文章

JAVA实现单双向链表的增删改查

双向链表增删改查分析和实现_韩顺平听课笔记

双向链表的增删改查C++完整实现

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)

C语言带头双向循环链表增删改查的实现

C语言带头双向循环链表增删改查的实现