Java链表的简单实现

    最近在复习Java数据结构与算法的知识,这里编写代码简单实现链表。
    欢迎批评指正!

 

 

package com.zhangyu.study.test20191112;

/**
 * Function: 手写链表实践
 *
 * @author zhangyu
 * Date: 2019/11/12
 * @since JDK 1.8
 */
public class MyLinkedList<T> {

    /**
     * 内部类,节点类
     */
    private class Node {

        private Node(T data) {
            this.data = data;
        }

        /**
         * 数据
         */
        private T data;

        /**
         * 下一个节点
         */
        private Node next;
    }

    /**
     * 头节点
     */
    private Node head ;

    /**
     * 尾结点 方便遍历
     */
    private Node last;

    /**
     * 容量
     */
    private int size;

    /**
     * 根据索引获取数据
     * @param index 索引
     * @return      数据
     */
    public Node get(int index) {
        if (index <0 || index >= size) {
            throw new IndexOutOfBoundsException("索引超出界限!");
        }
        Node tmp = head;
        for (int i = 0; i < index; i++) {
            tmp = tmp.next;
        }
        return tmp;
    }

    /**
     * 在指定位置插入数据
     * @param index 索引
     * @param data  数据
     * @return      插入的数据
     */
    public T insert(Integer index, T data) {
        if (index <0 || index > size) {
            throw new IndexOutOfBoundsException("索引超出界限!");
        }
        Node insertNode = new Node(data);
        if (size == 0) {
            head = insertNode;
            last = insertNode;
        } else if (index == 0) {
            insertNode.next = head;
            head = insertNode;
        } else if (index == size) {
            last.next = insertNode;
            last = insertNode;
        } else {
            Node current = get(index-1);
            insertNode.next = current.next;
            current.next = insertNode;
        }
        size ++ ;
        return data;
    }

    /**
     * 输出结果
     */
    public void print() {
        if (size == 0) {
            System.out.println("None");
        } else {
            Node tmp = head;
            do{
                System.out.println(tmp.data);
                tmp = tmp.next;
            } while (tmp != null);
        }
    }

    /**
     * 移除链表中的元素
     * @param index     索引
     * @return          移除的元素
     */
    public T remove(int index) {
        Node remove = get(index);
        if (index == 0) {
            head = remove.next;
        } else if (index == size - 1){
            last = get(index -1);
            last.next = null;
        } else {
            Node pre = get(index - 1);
            pre.next = remove.next;
        }
        size --;
        return remove.data;
    }

    public static void main(String[] args) {
        MyLinkedList<Integer> myLinkedList = new MyLinkedList<>();
        myLinkedList.insert(0,2);
        myLinkedList.insert(1,4);
        myLinkedList.insert(1,6);
        myLinkedList.insert(3,8);
        myLinkedList.insert(4,2);
        myLinkedList.insert(5,0);

        myLinkedList.print();
        System.out.println("===============");
        myLinkedList.remove(0);
        myLinkedList.print();
        System.out.println("==============");
        myLinkedList.remove(myLinkedList.size - 1);
        myLinkedList.print();
        System.out.println("==============");
        myLinkedList.remove(2);
        myLinkedList.print();
        System.out.println("==============");
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值