707. 设计链表

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


使用虚拟头结点会容易些,这里使用的是头尾指针。

    // 使用头尾指针
    ListNode head;

    ListNode tail;
    // 用于记录链表中的数据个数
    int size=0;

    public MyLinkedList() {

    }
    
    public int get(int index) {
        if(index >= size || index < 0) {
            return -1;
        }
        ListNode cur = head;

        for(int i=0;i<index;i++) {
            cur = cur.next;
        }
        return cur.val;

    }
    
    public void addAtHead(int val) {
        ListNode node = new ListNode(val);
        node.next = head;
        head = node;
        if(tail == null) {
            tail = node;
        }
        size++;

    }
    
    public void addAtTail(int val) {
        ListNode node = new ListNode(val);
        if(tail == null) {
            tail = node;
            head = node;
        } else {
            tail.next = node;
            tail = node;
        }
        size++;
    }
    
    public void addAtIndex(int index, int val) {
        if(index == size) {
            addAtTail(val);
        } else if(index <=0) {
            addAtHead(val);
        } else if(index > size) {
            return;
        } 
        else {
            ListNode node = new ListNode(val);
            ListNode cur= head;
            for(int i=0;i<index-1;i++) {
                cur = cur.next;
            }
            node.next = cur.next;
            cur.next = node;
            size++;
        }

    }
    
    public void deleteAtIndex(int index) {
        if(index <0 || index >= size) {
            return;
        }

        if(index == 0) {
            head = head.next;
            if(head == null) {
                tail = null;
            }
        } else {
            ListNode prev = head;

            for(int i=0;i<index-1;i++) {
                prev = prev.next;
            }
            ListNode cur = prev.next;
            prev.next = cur.next;
            cur.next = null;
            // 这里犯了一个大错,就是没有更新尾结点。
            // 虽然不影响删除逻辑,但是之后的尾添加就收到影响了
            // 所以一定要更新尾结点的状态
            if(cur == tail) {
                tail = prev;
            }
            
        }
        size--;


    }
posted @ 2022-02-26 14:04  一颗青菜  阅读(3)  评论(0)    收藏  举报