java实现单链表

一. 本文内容
本文主要总结单链表种一些简单的操作,包括链表结点添加,删除,获取节点信息,打印节点。

二. 实现
Java中单链表采用Node实体类来表示节点。其中data为节点存储的数据,next指向下一个节点。

package com.hnu.linkedlist;

public class Node {
    public Object data;
    public Node next;

    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }

    public Node(Object data) {
        this.data = data;
    }
}

我们有了实体类表示节点后就可以构造链表了

package com.hnu.linkedlist;

/**
 * 自定义链表
 */
public class Mylinkedlist<E> {
    //头节点
    private Node head ;
    //链表节点个数
    private int size = 0;

    /**
     * 链尾添加元素
     * @param element
     */
    public void add(E element){
        Node node = new Node(element);

        if (head == null){
            head = node;
        }else {
            Node temp = head;
            while (temp.next != null){
                temp = temp.next;
            }
            temp.next = node;
        }
        size++;
    }

    /**
     * 根据索引返回元素
     * @param index
     * @return
     */
    public E get(int index){
        checkIndex(index);
        Node temp = head;
        for (int i = 0; i < index; i++) {
            temp = temp.next;
        }
        return (E)temp.data;
    }

    /**
     * 根据索引删除指定位置元素
     * @param index
     */
    public void delete(int index){
        checkIndex(index);
        if (index == 0){
            head = head.next;
        }else {
            Node temp = head;
            Node pretemp = null;
            for (int i = 0; i < index; i++) {
                pretemp = temp;
                temp = temp.next;
            }
            pretemp.next = temp.next;
        }
        size--;
    }

    /**
     * 插入节点
     * @param index
     * @param element
     */
    public void add(int index , E element){
        checkIndex(index);
        Node node = new Node(element);
        if (index == 0){
            node.next = head;
            head = node;
        }else {
            Node temp = head;
            Node pretemp = null;
            for (int i = 0; i < index; i++) {
                pretemp = temp;
                temp = temp.next;
            }
            node.next = temp;
            pretemp.next = node;
        }
        size++;
    }

    /**
     * 返回链表长度
     * @return
     */
    public int linkedSize(){
        return size;
    }

    /**
     * 索引合法性检查
     * @param index
     */
    public void checkIndex(int index){
        if (index < 0 || index > size-1)
            throw new IllegalArgumentException("索引数字不合法: "+index);
    }

    /**
     * 打印元素
     * @return
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        Node temp = head;
        while (temp != null){
            sb.append(temp.data + ",");
            temp = temp.next;
        }
        sb.setCharAt(sb.length()-1 , ']');
        return sb.toString();
    }
}

为了方便操作,我们增加了泛型,和对一些合法性检查的操作方法进行了封装。然后我们用测试类对我们创建的链表进行测试

package com.hnu.linkedlist;

public class Test {
    public static void main(String[] args) {
        Mylinkedlist<String> mylinkedlist = new Mylinkedlist<>();
        mylinkedlist.add("a");
        mylinkedlist.add("b");
        mylinkedlist.add("c");
        System.out.println(mylinkedlist.toString());
        System.out.println(mylinkedlist.get(2));
        mylinkedlist.delete(0);
        System.out.println(mylinkedlist.toString());
        mylinkedlist.add(0,"d");
        System.out.println(mylinkedlist.toString());
        System.out.println("链表长度: "+ mylinkedlist.linkedSize());
    }
}

运行结果

在这里插入图片描述
到此,用java实现一个简单的链表就完成了。欢迎各位大佬们指导学习。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页