Java 基于泛型实现的单链表以及基本操作

可通过传递一个数组实现链表的初始化
倒序打印链表时,采用的递归。也可采用栈的方法实现。

定义节点类:

public class Node<T> {
    public T data; // 节点的数据
    public Node<T> nextNode; // 子节点
    public Node() { 
    }
    public Node(T data) {
        this.data = data;
    }
}

定义链表类:

public class LinkList<T> {
    public Node<T> headNode; // 头结点
    public int LenOfLinkList; //链表长度
    
    
    public LinkList(){
    }
    /**
     * 传递一个数组初始化链表
     * @param initialData
     */
    public LinkList(T[] initialData ){
        if(initialData.length == 0) {
            this.headNode = new Node<T>();
        }else {
            this.headNode = new Node<T>();
            this.headNode.data = initialData[0]; // 头结点赋值
            this.LenOfLinkList = 1;
            Node<T> p = this.headNode; // 复制头结点的地址
            for(int i=1; i<initialData.length; i++) {
                Node<T> x = new Node<T>(); // 新建子节点
                x.data = initialData[i]; // 初始化子节点数据
                p.nextNode = x; // 子节点插入链表
                p = x; // p指向下一节点
                this.LenOfLinkList++; // 链表长度自增
            }
        }   
    }
    
    /**
     * 获取链表的头结点
     * @return
     */
    public Node<T> getHeadNode(){
        return this.headNode;
    }
    /**
     * 判断链表是否为空
     * @return
     */
    public boolean isEmpty() {
        return this.LenOfLinkList == 0;
    }
    
    /**
     * 取得链表长度
     * @return
     */
    public int getLength() {
        return this.LenOfLinkList;
    }
    /**
     * 依次打印链表
     */
    public void showLinkList() {
        Node<T> p = this.headNode;
        System.out.print("链表数据 : ");
        while(p!=null && p.data != null) {
            System.out.print(p.data+" ");
            p = p.nextNode;
        }
    }
    /**
     * 删除链表中指定节点的元素
     * @param index
     * @return
     */
    public boolean deleteChildByIndex(int index) {
        Node<T> p = this.headNode;
        Node<T> preNode = this.headNode;
        int count=1;
        if(index > this.LenOfLinkList || index<1) { return false; } // 索引超出链表长度或者小于1 直接返回false
        while(p != null && count != index ) {
            preNode = p;
            p = p.nextNode;
            count++;
        }
        preNode.nextNode = p.nextNode; // 丢弃p节点
        return true;
    }
    
    /**
     * 在链表中添加指定下标的元素
     * @param index
     * @param newNode
     * @return
     */
    public boolean addChildByINdex(int index, Node<T> newNode) {
        if(index > this.LenOfLinkList || index<1) { return false; } // 索引超出链表长度或者小于1 直接返回false
        Node<T> p = this.headNode;
        Node<T> preNode = this.headNode;
        int count=1;
        if(index > this.LenOfLinkList || index<1) { return false; } // 索引超出链表长度或者小于1 直接返回false
        while(p != null && count != index ) {
            preNode = p;
            p=p.nextNode;
            count++;
        }
        preNode.nextNode = newNode;
        newNode.nextNode = p;
        return true;
    }
    
    /**
     * 倒序打印链表(此处用的递归,同时可以用栈实现,递归需要注意递归的最大深度)
     * @param node
     */
    public static void showLinkListFromTheEnd(Node<?> node) {
        if(node != null) {
            if(node.nextNode != null) {
                showLinkListFromTheEnd(node.nextNode);
            }
            System.out.print(node.data+" ");
        }
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Integer[] k = new Integer[] {1,2,3,4,5,6,7,8,9};
        LinkList<Integer> link = new LinkList<Integer>(k);
        link.showLinkList();  // 打印
        link.deleteChildByIndex(5); // 根据序号删除元素
        link.showLinkList(); 
        Node<Integer> newNode = new Node<Integer>(200);
        link.addChildByINdex(5, newNode); // 指定位置添加元素
        link.showLinkList();
        System.out.println();
        System.out.print("链表倒序打印: ");
        LinkList.showLinkListFromTheEnd(link.getHeadNode()); // 倒序打印,需要获取链表的头结点
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,637评论 0 12
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 9,974评论 1 31
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,501评论 11 349
  • 一、 C/C++程序基础 面试例题1——分析代码写输出(一般赋值语句的概念和方法)。 面试例题2—...
    LuckTime阅读 6,156评论 2 42
  • 天下风云出我辈, 一入江湖岁月催; 皇图霸业谈笑间, 不胜人生一场醉。 提剑跨骑挥鬼雨, 白骨如山鸟惊飞; 尘事如...
    董栋冻冬阅读 2,817评论 0 1

友情链接更多精彩内容