双向链表

双向链表示意图

image

双向列表由三部分组成
链表头(由结点担任,它的前一个结点是null)
结点
链表尾(由结点担任,它的后一个结点是null)

结点之间按照线性顺序,指向前一个结点,指向后一个结点。 就构成了链表
比如 饺子的下一个结点是汤圆
那么汤圆的上一个结点就必须是饺子,这样他两前和后才都有关联。

每一个结点由三个参数构成

  1. 数据
  2. 上一个结点坐标
  3. 下一个结点坐标

定义一个Node_结点类

class Node_{
    public Object item; // 存放数据
    public Node_ next; //指向后一个节点
    public Node_ pre; // 指向前一个节点

    public Node_(Object item) {
        this.item = item;
    }

    @Override
    public String toString() {
        return "item = " + item ;
    }
}

组成链表

	Node_ tom = new Node_("tom");
        Node_ jack = new Node_("jack");
        Node_ bob = new Node_("bob");
        
            // 连接三个结点,形成双向链表
            // ton -> jack -> bob
            tom.next = jack;
            jack.next = bob;
            
            // bob -> jack -> tom
            bob.pre = jack;
            jack.pre = tom;
        
        // 让first 指向tom,表示作为链表头结点    
        Node_ first = tom;
        // 让last 指向bob,表示作为列表尾结点
        Node_ last = bob;

从头到尾遍历

while (first != null){
     System.out.println(first);
     first = first.next;
}

从尾到头遍历

while (last != null){
     System.out.println(last);
     last = last.pre;
}

往链表里插入数据

就是修改结点之间的两个指向,
image

例子,往A,B,中间插入一个C

只需要断开A的下一个结点指向,B的上一个结点指向即可

让A的下一个结点直接指向C,C的下一个结点指向B(图中未画出),C的上一个结点直接指向A。B的上一个结点指向C(图中未画出) 即可

image

// 插入数据
        Node_ mask = new Node_("mask");
        mask.next = bob;
        mask.pre = jack;
        jack.next = mask;
        bob.pre = mask;
posted @ 2022-11-17 00:42  沉睡的琥珀  阅读(118)  评论(0)    收藏  举报