双向链表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;
            }
        }
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值