Java单链表简单实现

package com.list;

/*
 * 单链表
 */
public class MyLinkedList {
    private Node head;// 头结点
    private int size;// 长度

    public MyLinkedList() {
        head = null;// 初始化头节点为空
        size = 0;// 初始化长度为0
    }

    // 重写toString方法
    @Override
    public String toString() {
        String str = "";
        Node temp = head;
        for (; temp != null;) {
            str += temp.getElement() + " ";
            temp = temp.getNext();// 后移之末尾
        }
        str = "[ " + str + "]";
        return str;
    }

    /*
     * add方法默认将结点加入到单链表的末尾
     */
    public void add(Node node) {
        if (head == null) {// 表明此时表为空,不存在头结点
            head = node;// 创造头结点
            size++;// 长度加一
        } else {// 头结点存在
            Node temp = head;// 将head赋值给临时变量
            while (temp.getNext() != null) {
                temp = temp.getNext();// 后移之末尾
            }
            temp.setNext(node);// 加入节点
            size++;// 长度加一
        }
    }

    /*
     * 插入函数
     */
    public void add(int index, Node node) throws IndexException {
        Node temp = head;// 将head赋值给临时变量
        if (size == 0) {// 当表为空时调用add加入至表头
            add(node);
            return;
        }
        if (index <= 0 || index > size + 1) {// 索引位置不正确
            throw new IndexException("索引位置不正确!");
        } else {
            if (index == 1) {// 插入位置为第一个是处理
                node.setNext(head);// 将原来的头节点设置为插入节点的后继
                head = node;// 头节点更改
                size++;// 长度增加
            } else {
                if (index == size + 1) {// 此时默认插入表尾
                    add(node);
                } else {// 插入既不是表头也不是表尾时
                    for (int i = 1; i < index - 1; i++) {
                        head = head.getNext();// 后移至插入位置前一位
                    }
                    node.setNext(temp.getNext());// 将temp的后继赋值给插入节点
                    temp.setNext(node);// 将temp的后继改为插入节点
                    size++;// 长度增加
                }
            }
        }

    }

    /*
     * 删除函数
     */
    public void remove(int index) throws IndexException {
        Node temp = head;// head赋值给temp
        if (index <= 0 || index > size) {// 索引位置不正确
            throw new IndexException("索引异常");
        } else {// 索引正确
            if (index == 1) {// 删除第一个元素
                head = head.getNext();
                size--;//长度减一
            } else {
                if (index == size) {// 索引正确删除最后一个元素
                    for (; temp.getNext().getNext() != null;) {// 移至倒数第二个元素
                        temp = temp.getNext();
                    }
                    temp.setNext(null);// 删除最后一个元素
                    size--;//长度减一
                }else {//删除元素不在表头或表尾
                    for(int i=1;i<index-1;i++) {//后移至删除节点的前一个节点
                        temp=temp.getNext();
                    }
                    temp.setNext(temp.getNext().getNext());//删除
                    size--;//长度减一
                }
            }
        }
    }

    public static void main(String[] args) throws IndexException {
        MyLinkedList list = new MyLinkedList();
        list.add(1, new Node<>("asdas"));
        list.add(1, new Node<>("202"));
        list.add(new Node<>(85));
        System.out.println(list);
        list.remove(3);
        System.out.println(list);
        list.add(2,new Node<>(2154));
        System.out.println(list);
    }
}

/*
 * 结点
 */
class Node<T> {
    private T element;// 值域
    private Node next;// 指针域
    // 节点初始化只可以设置值域

    public Node(T element) {
        this.element = element;
        next = null;
    }

    // 获取值域
    public T getElement() {
        return element;
    }

    // 获取指针域
    public Node getNext() {
        return next;
    }

    public void setNext(Node node) {
        next = node;
    }
}

/*
 * 索引异常类
 */
class IndexException extends Exception {
    public IndexException() {

    }

    public IndexException(String s) {
        super(s);
    }
}

猜你喜欢

转载自www.cnblogs.com/SAM-CJM/p/9285621.html
今日推荐