博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写双向链表LinkedList的几个常用功能
阅读量:6036 次
发布时间:2019-06-20

本文共 3292 字,大约阅读时间需要 10 分钟。

实现的功能如下:

1)创建链表
2)添加节点(默认添加和指定位置添加)
3)访问某一个节点
4)删除节点
5)获得链表的长度大小
6)判断链表是否为空
7)自定义链表的打印格式
8)清空链表

*注意:要弄清楚节点的前赴 和 后继,删除时要注意赋值的顺序!!!

定义 链表中 节点的类Node

public class Node {        /**     * 值     *      */    Object value;        /**     * 前驱     */    Node pre;        /**     * 后继     */    Node next;        public Node(){            }        public Node(Object value, Node pre, Node next) {        this.value = value;        this.pre = pre;        this.next = next;    }}

定义双向链表LinkList,实现功能如下:

/** * 双向链表 *  * @author min * */public class LinkList {    /**     * 头结点     */    private Node head;        /**     * 尾结点     */    private Node tail;        private int size;        public LinkList() {        head = new Node();        tail = new Node();                head.next = tail;        tail.pre = head;        size = 0;            }        public int size() {        return size;    }        public boolean isEmpty() {        return size==0;    }        public void clear() {        head.next = tail;        tail.pre = head;        size = 0;    }        /**     * 在末尾添加新的数据     *      * @param value 数据     */    public void add(Object value) {        Node node = new Node(value,tail.pre,tail);        tail.pre.next = node;        tail.pre = node;        size ++;        }        /**     * 在特地位置创建新的节点     * @param index     * @param value     */    public void add(int index, Object value) {        checkLinkList(index);                if(index == size -1) {            //插在最后一位            add(value);        }        else{            Node x = node(index-1);            Node y = node(index);            Node node = new Node(value, x, y);            x.next = node;            y.pre = node;            size ++;        }            }        /**     * 获取特定位置的节点     * @param index     * @return 节点存储的值     */    public Object get(int index) {        //检查是否在链表内        checkLinkList(index);        //节点的值        return node(index).value;    }    /**     * 删除特定的节点     * @param index     * @return 被删除的节点     */    public Node remove(int index) {        checkLinkList(index);        Node x = node(index);        x.pre.next = x.next;        x.next.pre = x.pre;        size --;        return x;    }        /**     * 检查索引是否在链表内     *      * @param index     */    private void checkLinkList(int index) {        if(index > size() ||index < 0)            throw new ArrayIndexOutOfBoundsException(index);    }    /**     * 遍历链表查询特定的节点     *      * @param index 索引     * @return 指定的节点     */    private Node node(int index) {        //第1个节点        Node firstNode = head;        //最后1个节点        Node lastNode = tail;                //从头开始遍历        if(index <=(size>>1) ) {            Node indexNode = firstNode;            for(int i = -1; i < index; i++)                indexNode = indexNode.next;            return indexNode;        }                    //从尾遍历        else{                        Node indexNode = lastNode;            for(int i = size; i>index; i--) {                indexNode = indexNode.pre;            }            return indexNode;        }            }        /**     * 重写链表输出方式     *      */    @Override    public String toString() {        StringBuilder builder = new StringBuilder();        String str = "";        for(int i = 0; i

测试

图片描述


只实现了一些常用功能,自己写的和工具包中的类对比,会从中get到很多。受益多多~

转载地址:http://dslhx.baihongyu.com/

你可能感兴趣的文章
dutacm.club Water Problem(矩阵快速幂)
查看>>
深入JVM内核--GC算法和种类
查看>>
iOS的AssetsLibrary框架访问所有相片
查看>>
读书笔记三
查看>>
数论 - 最小乘法逆元
查看>>
企业架构研究总结(22)——TOGAF架构开发方法(ADM)之信息系统架构阶段
查看>>
接口测试(三)--HTTP协议简介
查看>>
周志华《机器学习》课后答案——第4章.决策树
查看>>
frameset分帧问题
查看>>
特殊样式:ime-mode禁汉字,tabindex焦点
查看>>
linux
查看>>
Layout父元素点击不到的解决办法
查看>>
【面试次体验】堆糖前端开发实习生
查看>>
基于apache实现负载均衡调度请求至后端tomcat服务器集群的实现
查看>>
C#+QQEmail自动发送邮件
查看>>
[Hadoop]MapReduce多输出
查看>>
Android Activity详解(一)
查看>>
快准车服完成3000万元A+轮融资,年底将开始B轮融资
查看>>
让我去健身的不是漂亮小姐姐,居然是贝叶斯统计!
查看>>
MySQL 数据约束
查看>>