力扣707

小明 2025-05-06 11:31:26 7

力���题目链接(opens new window)

题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

    使用虚拟头节点统一操作,

    遍历链表的指针的起始处根据不同的操作有不同的设置,

     

    class MyLinkedList {
    public:
        struct LinkNode{
            int val;
            LinkNode * next;
            LinkNode(int val):val(val),next(nullptr){}
        };
        MyLinkedList() {
           dumHead = new LinkNode(0);
           size = 0;
        }
        
        int get(int index) {
            if(index  (size - 1)){
                return -1;
            }
            LinkNode * p = dumHead->next;//遍历链表得指针指向虚拟头节点的下一个结点
            while(index--){
                p=p->next;
            }
            return p->val;
        }
        
        void addAtHead(int val) {
            LinkNode * s= new LinkNode(val);
            s->next = dumHead->next;//遍历链表得指针指向虚拟头节点的下一个结点
            dumHead->next = s;
            size++;//这里链表长度要加1
        }
        
        void addAtTail(int val) {
            LinkNode * s = new LinkNode(val);
            LinkNode*p=dumHead;//遍历链表得指针指向虚拟头节点
            while(p->next!=nullptr){
                p=p->next;
            }
            p->next = s;
            size++;//链表长度加一
        }
        
        void addAtIndex(int index, int val) {
            if(index>size)return;
            if(indexnext;//p指向index结点的前一个结点
                }
                s->next = p->next;
                p->next = s;
                size++;
        }
        
        void deleteAtIndex(int index) {
           if (index >= size || index next;//cur的next指向的要删除的结点,即第n个
            }
            LinkNode* tmp = cur->next;
            cur->next = cur->next->next;
            delete tmp;
            //delete命令指示释放了tmp指针原本所指的那部分内存,
            //被delete后的指针tmp的值(地址)并非就是NULL,而是随机值。也就是被delete后,
            //如果不再加上一句tmp=nullptr,tmp会成为乱指的野指针
            //如果之后的程序不小心使用了tmp,会指向难以预想的内存空间
            tmp=nullptr;
            size--;
        }
        private:
            int size;
            LinkNode* dumHead;
    };
    /**
     * Your MyLinkedList object will be instantiated and called as such:
     * MyLinkedList* obj = new MyLinkedList();
     * int param_1 = obj->get(index);
     * obj->addAtHead(val);
     * obj->addAtTail(val);
     * obj->addAtIndex(index,val);
     * obj->deleteAtIndex(index);
     */

     

The End
微信