手写单向链表

public class LinkList {


    private static class Node {//链表的结点
        int element;//存储的元素
        LinkList.Node next;// 下个指针

        public Node() {
        }

        public Node(int element) {
            this.element = element;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "element=" + element +
                    ", next=" + next +
                    '}';
        }
    }

    private Node first;//链表头部
    private Node tail;//链表尾部
    private int size;//链表元素个数

    public LinkList() {
        size = 0;
    }

    public void addFirst(int element) {//链表头部加入元素

        if (size == 0) {

            first = new Node();
            first.element = element;
            first.next = null;

            tail = first;
        } else {

            Node temp = first;

            first = new Node();
            first.element = element;
            first.next = temp;

        }

        size++;
    }

    public void addLast(int element) {//尾部加入元素
        if (size == 0) {
            addFirst(element);
        } else {
            Node temp = tail;

            tail = new Node();
            tail.element = element;
            tail.next = null;

            temp.next = tail;
            size++;
        }

    }

    public void addAt(int idx, int element) {//指定下标加入元素
        if (idx == 0) {
            addFirst(element);
        } else if (idx == (size - 1)) {

            addLast(element);
        } else {
            Node now = new Node(element);
            Node front = getNodeAt(idx - 1);
            Node after = front.next;
            front.next = now;
            now.next = after;
            size ++;
        }
    }

    public Node getFirst() {//获取头部结点
        return first;
    }

    public Node getLast() {//获取尾部结点
        return tail;
    }

    public int getAt(int idx) {//根据下标获取元素
        return getNodeAt(idx).element;
    }

    public Node getNodeAt(int idx) {//根据下标获取结点

        if (idx > size) {
            return null;// or exception
        }

        Node temp = first;
        for (int i = 0; i < idx; i++) {
            temp = temp.next;
        }
        return temp;
    }

    public void  removeFirst(){//删除第一个结点
        if (size == 1) {

            first = null;
            tail = null;
        } else {
            first = first.next;
        }
    }

    public void  removelast(){//删除最后一个结点
        Node front = getNodeAt(size - 2);

        front.next = null;

        tail = front;
    }

    public void removeAt(int idx) {//根据下标删除结点(元素)

        if (size != 0 && idx < size) {
            if (idx == 0) {
                removeFirst();
            } else if (idx == (size - 1)) {
                removelast();
            } else {

                Node front = getNodeAt(idx - 1);

                Node now = front.next;
                Node after = now.next;

                front.next = after;
                now = null;
            }
            size--;
        }
    }

    public String display() {//获取所有元素
        StringBuilder sb = new StringBuilder();
        sb.append(first.element).append(",");
        Node temp = first;
        while (temp.next != null) {
            temp = temp.next;
            sb.append(temp.element).append(",");
        }

        return sb.toString();
    }

    @Override
    public String toString() {
        return "LinkList{" +
                "first=" + first +
                ", tail=" + tail +
                ", size=" + size +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值