微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LinkedList源码解读

1.背景

2.先来认识一下什么是双向链表

示例图:

代码:

package com.ldp.collection.demo01;

import org.junit.Test;

/**
 * @author 姿势帝-博客园
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 04/05 6:03
 * @description
 */
public class Test04LinkedList {
    /**
     * 双向链表理解
     */
    @Test
    public void test01() {
        // 定义三个节点
        Node node1 = new Node("张无忌");
        Node node2 = new Node("赵敏");
        Node node3 = new Node("周芷若");
        // 将节点node1->node2->node3 依次使用双向链表链接
        // node1->node2
        node1.next = node2; // 节点1的下一个元素是节点2
        node2.prev = node1; // 节点2的上一个元素是节点1
        // node2->node3
        node2.next = node3; // 节点2的下一个元素是节点3
        node3.prev = node2; // 节点3的上一个元素是节点2

        Node first = node1;// 头节点为node1
        Node last = node3; // 尾节点为node3

        printNode(first, true); // 从头到尾
        printNode(last, false);    // 从尾到头遍历

        System.out.println("尾部添加一个元素:小昭");
        Node node4 = new Node("小昭");
        last.next = node4;
        node4.prev = last;
        last = node4;
        printNode(first, true);

        System.out.println("头部添加一个元素:张三丰");
        Node node5 = new Node("张三丰");
        node5.next = first;
        first.prev = node5;
        first = node5;
        printNode(first, true);

        // 在中间添加一个节点
        System.out.println("在node1[张无忌]与node2[赵敏]之前添加一个:node6[金毛狮王]");
        Node node6 = new Node("金毛狮王");
        node1.next = node6; // 张无忌的下一个是金毛狮王
        node6.prev = node1; // 金毛狮王的上一个是张无忌

        node6.next = node2; // 金毛狮王的下一个是赵敏
        node2.prev = node6; // 赵敏的上一个是金毛狮王
        printNode(first, true);
    }

    /**
     * 节点遍历
     *
     * @param node 遍历的节点
     * @param flag flag=true表示从头到尾遍历,flag=false从尾到头遍历
     */
    public void printNode(Node node, boolean flag) {
        System.out.println("节点遍历开始......");
        while (true) {
            if (node == null) break;
            System.out.println("当前节点数据为:" + node.item);
            if (flag) {
                node = node.next; // 指向下一个节点,从头到尾遍历
            } else {
                node = node.prev; // 指向上一个节点,从尾到头遍历
            }
        }
        System.out.println("   ");
    }
}
class Node {
    Node prev; // 上一个节点
    Object item; //  数据
    Node next;// 下一个节点
    public Node(Object item) {
        this.item = item;
    }
}
View Code

 

3.源码解读

 

完美!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐