707. 设计链表

319 阅读1分钟

题目介绍

力扣707题:leetcode-cn.com/problems/de…

image.png

方法:单向链表

按照题目要求,需要实现链表的增删改查功能,所以需要我们自己定义实现功能的数据结构,很容易就能够想到使用单链表的数据结构,该结构简单定义如下:

class ListNode {
    int val;//节点值
    ListNode next;//指向下一个节点的指针
    public ListNode(int val) {
        this.val = val;
    }
}

接着,我们这里还需要定义一个哑节点ListNode dumy,指向单链表的头节点的上一个节点,即dumy.next指向单链表的头节点,还需要使用变量size来记录当前链表的节点个数,当添加节点时,size++,当删除节点时,执行size--

代码如下:

class MyLinkedList {

    class ListNode {
        int val;//节点值
        ListNode next;//指向下一个节点的指针
        public ListNode(int val) {
            this.val = val;
        }
    }

    //链表的头节点上一个节点
    ListNode dumy = null;

    int size = 0;//节点个数

    public MyLinkedList() {
        dumy = new ListNode(-1);//初始化哑节点
        dumy.next = null;
    }

    public int get(int index) {
        if(index < 0 || index >= size) {
            return -1;
        }
        ListNode temp = dumy.next;
        for(int i = 0 ; i < index; i++) {
            temp = temp.next;
        }
        return temp.val;
    }

    /**
     * 在链表头添加节点
     */
    public void addAtHead(int val) {
        ListNode newHead = new ListNode(val);
        newHead.next = dumy.next;
        dumy.next = newHead;
        size++;
    }

    /**
     *在链表末尾元素
     */
    public void addAtTail(int val) {
        ListNode temp = dumy;
        while(temp.next != null) {
            temp = temp.next;
        }
        ListNode tailNode = new ListNode(val);
        temp.next = tailNode;
        size++;
    }

    /**
     * 在指定索引添加元素,同样也需要找到该索引的上一个节点
     */
    public void addAtIndex(int index, int val) {
        if(index > size) {
            return;
        }else if(index == size) {
            //在末尾插入节点
            addAtTail(val);
        }else if(index <= 0) {
            //在链表的头部插入节点
            addAtHead(val);
        }else {
            //普通插入节点
            ListNode temp = dumy;
            for(int i = 0; i < index ; i++) {
                temp = temp.next;
            }
            ListNode insertNode = new ListNode(val);
            insertNode.next = temp.next;
            temp.next = insertNode;
            size++;
        }

    }

    /**
     * 删除指定索引的节点,需要找到该索引的对应节点的上一个节点
     */
    public void deleteAtIndex(int index) {
        if(index < 0 || index >= size) {
            return;
        }
        ListNode temp = dumy;
        for(int i = 0; i < index; i++) {
            temp = temp.next;
        }
        temp.next = temp.next.next;
        size--;
    }
}

复杂度分析

  • 时间复杂度:O(N),N为链表的节点个数
  • 空间复杂度:O(1)