双向链表

简介: java实现的一个双向链表

java实现双向链表

package com.scc.demo;

public class MyLinkedList {
    private Node first;// 链表中第一个节点
    private Node last;// 链表中最后一个节点
    private int size;// 节点的数量
    // 创链表中的每一个节点

    class Node {
        Node prev;// 上一个节点对象
        Node next;// 下一个节点对象
        Object ele;// 当前节点 元素
        // 添加一个构造方法可以节点时并赋值

        public Node(Object ele) {
            this.ele = ele;
        }
    }

    // 添加数据的第一位
    public void addFirst(Object ele) {
        Node node = new Node(ele);// 节点对象
        // 如果当前节点是第一次添加(当前节点即是开头也是结尾)
        if (size == 0) {
            this.first = node;
            this.last = node;
        } else {
            // 新节点的下一位是原有的节点
            node.next = this.first;
            // 把新增的节点作为原有节点之前的一个节点
            // 即第一个节点
            this.first.prev = node;
            // 需要开始节点更改
            this.first = node;
        }
        size++;
    }

    // 添加最后一位
    public void addLast(Object ele) {
        // 先创建节点
        Node node = new Node(ele);
        if (size == 0) {
            this.first = node;
            this.last = node;
        } else {
            // 当前节点的下一位是新的节点
            this.last.next = node;
            // 新节点的上一位是原有节点
            node.prev = this.last;
            // 更新新节点为下一个节点
            this.last = node;
        }
    }

    @Override
    public String toString() {
        if (size == 0) {
            return "[]";
        }
        StringBuffer sbr = new StringBuffer();
        // 获取第一个节点
        sbr.append("[");
        for (int i = 0; i < size - 1; i++) {
            sbr.append(first.ele);
            if (i != size - 1) {
                sbr.append(",");
            } else {
                sbr.append("]");
            }
            first = first.next;// 获取下一个节点
        }
        return sbr.toString();
    }
    // 删除节点
    public void remove(Object ele) {
        // 找到要删除的节点
        Node first = this.first;
        for (int i = 0; i < size; i++) {
            if (!first.ele.equals(ele)) {
                if (first.next == null) {
                    return;
                }
                first = first.next;
            }
        }
        // 删除节点
        if (first == this.first) {
            this.first = first.next;
            this.first.prev = null;
        } else if (first == last) {
            this.last = first.prev;
            this.last.next = null;
        } else {
            // 把删除节点的上一个节点连接删除节点的下一个节点
            first.prev.next = first.next;
            // 把删除节点的下一个节点连接删除节点的上一个节点
            first.next.prev = first.prev;
        }
        size--;
    }
}
相关文章
|
1月前
|
存储
双向链表
单链表每个结点有一个指针域和一个数据域,要访问任何结点都需知道头结点,不能逆着进行。双向链表则添加了一个指针域,通过两个指针域分别指向结点的前一个结点和后一个结点。这样的话,可以通过双链表的任何结点访问到它的前一个结点和后一个结点。 两个指针域一个存储直接后继结点的地址,一般称为右链域,另一个存储直接前驱结点,一般称为左链域。
|
2月前
|
存储
双向链表(详解)
双向链表(详解)
37 1
|
6月前
|
存储
双向链表专题
双向链表专题
51 6
|
6月前
双向链表的实现
双向链表的实现
24 0
|
6月前
|
存储 算法 前端开发
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
33 0
|
7月前
秒懂双向链表
秒懂双向链表
33 0
|
7月前
|
存储
双向链表介绍
带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨的”。哨兵位存在的意义:避免链表出现死循环。
45 0
|
7月前
|
Java
7.双向链表最佳实现
7.双向链表最佳实现
63 1
|
7月前
|
存储
【双向链表】数据结构双向链表的实现
【双向链表】数据结构双向链表的实现
|
存储 算法 搜索推荐
双向链表
双向链表是一种链式存储结构,每个节点包含两个指针,分别指向其前驱和后继。相比于单向链表,双向链表可以在常数时间内向前或向后遍历整个链表。因此,双向链表在需要频繁遍历链表的场景中具有优势。
59 7