美文网首页
Java 基于泛型实现的单链表以及基本操作

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

作者: ccccmatser | 来源:发表于2017-11-20 21:05 被阅读96次

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

定义节点类:

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()); // 倒序打印,需要获取链表的头结点
    }
}

相关文章

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

    可通过传递一个数组实现链表的初始化倒序打印链表时,采用的递归。也可采用栈的方法实现。 定义节点类: 定义链表类: 测试类

  • Java实现单链表

    链表的结构相信大家都已经理解,这次简单的实现一个单链表,以及其中的操作 第一步 定义节点类 其中定义泛型约束 以及...

  • Java实现单链表以及链表的基本操作

    Github issues:https://github.com/littlejoyo/Blog/issues/ ...

  • 死磕Java泛型(一篇就够)

    Java泛型,算是一个比较容易产生误解的知识点,因为Java的泛型基于擦除实现,在使用Java泛型时,往往会受到泛...

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • 数据结构与算法之链表(五)双链表实现

    引言 前面几篇文章详细学习了单链表的操作,有了这个基础,双链表的实现便水到渠成。由于它的基本实现和单链表基本一样,...

  • 百度面试总结

    1. 数据结构 链表 基本操作 java实现 B+树 基本操作 java实现 2. 算法 回文判断 3. 多线程 ...

  • 集合类

    集合类都在java.util包中 1.list 泛型 以上操作是有风险 所以出现了泛型。使用泛型可以有效的解决基于...

  • 基于动态数组的实现 Java实现 基于链表的栈的实现 Java实现

  • 队列

    基于数组的循环队列 Java实现 基于链表的队列实现 Java实现

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/wasbvxtx.html