训练营打卡day3

文章讨论了链表和数组的区别,重点介绍了在LeetCode中的链表操作,如移除元素时避免空指针异常,以及反转链表和设计链表时对边界条件和递归的理解。作者强调了处理边界条件在解决问题中的重要性。

链表和数组区别

数组是连续的,链表是杂乱排列的,通过链表内部结构去指向下一个节点。

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

报错:runtime error: member access within null pointer of type ‘ListNode’ (solution.cpp)

报错原因:试图操作空指针,因为没有判断当前的链表为空就对其内的成员进行了操作

由于链表基础了解的也不深刻,这道题上来还是比较蒙圈的,不知道如何下手,写了一半就去看视频和代码随想录了。看完之后自己把两种方法都写了一边,这里边需要注意的点就是要考虑临界条件,cur 还是 cur->next != NULL。个人感觉还是容易钻如想把所有情况都考虑明白的牛角尖,其实很多时候边界条件考虑好了之后其他的都是ok的。

题目:206. 反转链表 - 力扣(LeetCode)

这道题自己是按自己的思路写了代码出来,AC通过了。

然后看了一下代码随想录的视频,双指针和递归算法很简便很巧妙。不过还是要搞清楚边界条件和递归时谁是cur 谁是pre。

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

这道题还是很难得,首先定义类自己就很吃力,然后考虑各种链表情况也很麻烦。看完视频之后自己把代码敲一遍,先有个印象,以后有机会再慢慢深入掌握。class:C++类(Class)的定义与实现_c++ class-CSDN博客

class MyLinkedList {
public:
    struct ListNode{
        int val;
        ListNode* next;
        ListNode() : val(0), next(nullptr) {} 
        ListNode(int x) : val(x), next(nullptr) {} 
        ListNode(int x, ListNode *next) : val(x), next(next) {} 
    };
    MyLinkedList() {
        dummynode = new ListNode();
        _size = 0;
    }
    
    int get(int index) {
        if(index < 0 || index > _size - 1) {
            return -1;
        }
        ListNode* cur = dummynode->next;
        while(index) {
            cur = cur->next;
            index--;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        ListNode* cur = dummynode;
        ListNode* newnode = new ListNode(val);
        newnode->next = cur->next;
        cur->next = newnode;
        _size++;
    }
    
    void addAtTail(int val) {
        ListNode* newnode = new ListNode(val);
        ListNode* cur = dummynode;
        while(cur->next != nullptr) {
            cur = cur->next;
        }
        cur->next = newnode;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        if(index > _size) return;
        if(index < 0) index = 0;
        ListNode* newnode = new ListNode(val);
        ListNode* cur = dummynode;
        while(index--) {
            cur = cur->next;
        }
        newnode->next = cur->next;
        cur->next = newnode;
        _size++;
    }
    
    void deleteAtIndex(int index) {
        if(index < 0 || index >= _size) return;
        ListNode* cur = dummynode;
        while(index--) {
            cur = cur->next;
        }
        cur->next = cur->next->next;
        _size--;
    }
private:
    int _size;
    ListNode* dummynode;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值