链表-设计链表

51 阅读1分钟

LC707 leetcode.cn/problems/de…

class MyLinkedList {
    // 定义链表节点类
    private static class Node {
        int val;
        Node next;
        Node(int val) {
            this.val = val;
        }
    }
​
    private Node head; // 链表的头节点
    private int size; // 链表的大小
​
    // 初始化链表
    public MyLinkedList() {
        head = null;
        size = 0;
    }
​
    /**
     * 获取链表中第 index 个节点的值。如果索引无效,则返回 -1。
     *
     * @param index 目标节点的索引
     * @return 节点的值,如果索引无效则返回 -1
     */
    public int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        Node cur = head;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur.val;
    }
​
    /**
     * 在链表的头部添加一个值为 val 的节点。
     *
     * @param val 要添加的节点值
     */
    public void addAtHead(int val) {
        Node newNode = new Node(val);
        newNode.next = head;
        head = newNode;
        size++;
    }
​
    /**
     * 在链表的尾部添加一个值为 val 的节点。
     *
     * @param val 要添加的节点值
     */
    public void addAtTail(int val) {
        Node newNode = new Node(val);
        if (head == null) {
            head = newNode;
        } else {
            Node cur = head;
            while (cur.next != null) {
                cur = cur.next;
            }
            cur.next = newNode;
        }
        size++;
    }
​
    /**
     * 在链表的指定索引 index 处插入一个值为 val 的节点。
     * 如果索引等于链表的长度,则该节点将附加到链表的末尾。
     * 如果索引大于链表长度,则不会插入节点。
     *
     * @param index 要插入节点的索引
     * @param val 要插入的节点值
     */
    public void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        if (index <= 0) {
            addAtHead(val);
        } else {
            Node newNode = new Node(val);
            Node cur = head;
            for (int i = 0; i < index - 1; i++) {
                cur = cur.next;
            }
            newNode.next = cur.next;
            cur.next = newNode;
            size++;
        }
    }
​
    /**
     * 删除链表中第 index 个节点,如果索引无效则不进行任何操作。
     *
     * @param index 要删除节点的索引
     */
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        if (index == 0) {
            head = head.next;
        } else {
            Node cur = head;
            for (int i = 0; i < index - 1; i++) {
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        size--;
    }
}