代码随想录:设计链表

代码随想录:设计链表

这题遇到的问题是,在private中声明后,在构造函数中初始化的时候又声明了一次,大类的构造函数和结构体的构造函数弄晕掉了。

另外虚头节点是真好用,以后记得用。

一开始写成了这样:

class MyLinkedList {
public:
    struct LinkNode {
        int value;
        LinkNode* next;
    };
    
    MyLinkedList() {
		    LinkNode* virtHead = new LinkNode();
		    virtHead->value = 0;
		    virtHead->next = NULL;

    _size = 0;
    }
    
    省略
private:
    int _size;
    LinkNode* virtHead;
};

正确代码如下:

class MyLinkedList {
public:
    struct LinkNode {
        int value;
        LinkNode* next;
    };

    MyLinkedList() {
        virtHead = new LinkNode();
        virtHead->value = 0;
        virtHead->next = NULL;

        _size = 0;
    }

    int get(int index) {
        // 遍历链表,找到下标为index的节点
        if (index > _size - 1 || index < 0) {
            return -1;
        }
        LinkNode* target = virtHead;
        for (int i = 0; i < index + 1; i++) {
            target = target->next;
        }
        return target->value;
    }

    void addAtHead(int val) {
        LinkNode* insertNode = new LinkNode();
        insertNode->value = val;
        insertNode->next = virtHead->next;
        virtHead->next = insertNode;
        _size++;
    }

    void addAtTail(int val) {
        LinkNode* insertNode = new LinkNode();
        insertNode->value = val;
        insertNode->next = NULL;

        LinkNode* target = virtHead;
        while (target->next != NULL) {
            target = target->next;
        }

        target->next = insertNode;
        _size++;
    }

    void addAtIndex(int index, int val) {
        LinkNode* target = virtHead;
        if (index > _size) {
        } else {
            for (int i = 0; i < index; i++) {
                target = target->next;
            }

            LinkNode* insertNode = new LinkNode();
            insertNode->value = val;
            insertNode->next = target->next;

            target->next = insertNode;
            _size++;
        }
    }

    void deleteAtIndex(int index) {
        if (index > _size - 1 || index < 0) {
        } else {
            LinkNode* target = virtHead;
            for (int i = 0; i < index; i++) {
                target = target->next;
            }
            target->next = target->next->next;
            _size--;
        }
    }

private:
    int _size;
    LinkNode* virtHead;
};

/**
 * 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);
 */
posted @   huigugu  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示