用java实现双向循环链表

今天在自己的第一篇技术分享中介绍一下双向循环链表的java实现(图都是自己手画的,不太会用作图工具,丑也难免,属实不易【捂脸】)

1、单个结构

2、整体结构

看结构是不是一清二楚呀。。嘿嘿。那咱看代码看代码。

3、代码实现

public class PointerTest {

    private static Pointer allPointer;

    static class Pointer {
        Pointer prior; //前一节点
        Pointer next; //后一节点
        int data;  //数据
    }

    /**
     * 初始化头节点
     */
    private static void initPoint() {
        allPointer = new Pointer();
        allPointer.prior = allPointer;//前指针指向自己
        allPointer.next = allPointer; //后指针指向自己
        allPointer.data = Integer.MIN_VALUE;
    }

    /**
     * 添加数据
     *
     * @param data
     */
    private static void addData(int data) {
        //创建数据为data的节点
        Pointer pointer = new Pointer();
        pointer.data = data;
        //创建对象p指向头节点,当p的下一节点不是头节点的时候一直后移
        Pointer p = allPointer;
        while (p.next != allPointer) {
            p = p.next;
        }
        //插入新节点(尾插法,p当前是指向最后一个节点
        p.next = pointer;
        pointer.prior = p;
        pointer.next = allPointer;
        allPointer.prior = pointer;
    }

    /**
     * 删除链表中为data的数据
     *
     * @param data
     */
    private static void delData(int data) {
        Pointer p = allPointer;
        while (p.next != allPointer) {
            p = p.next;
            if (p.data == data) {
                p.prior.next = p.next;//将p的前节点的下一节点指向p的下一节点
                p.next.prior = p.prior;//将p的下一节点的前一节点指向p的下一节点
            }
        }
    }

    /**
     * 将链表中数据为before全部更新为after
     *
     * @param before
     * @param after
     */
    private static void updateData(int before, int after) {
        Pointer p = allPointer;
        while (p.next != allPointer) {
            p = p.next;
            if (p.data == before) {
                p.data = after;
            }
        }
    }

    /**
     * 遍历
     */
    private static void printPoint() {
        //正向向后遍历
        Pointer pointer = allPointer.next;
        while (pointer != allPointer) {
            System.out.print("    " + pointer.data);
            pointer = pointer.next;
        }
        System.out.println();
        //反向向前遍历
        Pointer p = allPointer.prior;
        while (p != allPointer) {
            System.out.print("    " + p.data);
            p = p.prior;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        initPoint();
        for (int i = 0; i < 122; i++) {
            addData(i);
        }
        printPoint();
        delData(111);
        printPoint();
        updateData(6, 888);
        printPoint();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左岸的玫瑰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值