LeetCode刷题记录.Day4

移除链表元素

题目链接203. 移除链表元素 - 力扣(LeetCode)

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* varHead = new ListNode(0);
        varHead->next = head;
        ListNode* cur = varHead;
        while(cur->next != NULL){
            if(cur->next->val == val){
                ListNode* temp = cur->next;
                cur->next = cur->next->next;
                delete temp; 
            }
            else{
                cur = cur->next;
            }
        }
        head = varHead->next;
        delete varHead;
        return head;
    }
};

学生时代c语言课第一次卡壳就是卡在了链表上面,现在这个阶段,重新写链表相关的题目已经比那个时候好了很多。不过虚拟头结点法确实是没用过。学会了之后收获很高。

设计链表

题目链接707. 设计链表 - 力扣(LeetCode)

class MyLinkedList {
public:
struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr){}
    };

    MyLinkedList() {
        _varHead = new LinkedNode(0);
        _size = 0;
    }
    
    int get(int index) {
        if(index < 0 || index >_size-1){
            return -1;
        }
        LinkedNode* cur = _varHead->next;
        while(index--){
            cur = cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        LinkedNode* newHead = new LinkedNode(val);
        newHead->next = _varHead->next;
        _varHead->next = newHead;
        _size++;
    }
    
    void addAtTail(int val) {
        LinkedNode* newTail = new LinkedNode(val);
        LinkedNode* cur = _varHead;
        while(cur->next != NULL){
            cur = cur->next;
        }
        cur->next = newTail;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        if(index > _size || index < 0){
            return;
        }
        // if(index < 0){
        //     index = 0;
        // }
        // LinkedNode* cur = _varHead;
        // while(index--){
        //     cur = cur->next;
        // }
        // LinkedNode* newAdd = new LinkedNode(val);
        // newAdd->next = cur->next;
        // cur->next = newAdd;
        // _size++;

        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = _varHead;
        while(index--) {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
        _size++;
    }
    
    void deleteAtIndex(int index) {
        if(index >= _size || index < 0){
            return;
        }
        LinkedNode* cur = _varHead;
        while(index--){
            cur = cur->next;
        }
        LinkedNode* temp = cur->next;
        if(cur->next != NULL){
            cur->next = cur->next->next;
        }
        delete temp;
        _size--;
    }
private:
    int _size;
    LinkedNode* _varHead;
};

这道题,感觉挺简单的。上手写起来怎么写怎么不对,本地调试了一会儿,怎么都找不到原因。中间加了无数个条件判断。

然后发现是最初的两个地方搞错了。在删除的时候,索引大于等于长度,就不执行。因为索引下标是从0开始,index等于长度的时候也是越界了的。

get也是同理。

搞错了这两个地方的判断,导致我后面错得稀里糊涂的

posted @ 2022-11-03 00:26  凱風快晴  阅读(27)  评论(0)    收藏  举报