草庐IT

代码随想录算法训练营第三天|203、移除链表元素|707、设计链表|206、反转链表

tinct 2023-03-28 原文

203、移除链表元素

·虚拟头节点


题目链接:https://leetcode.cn/problems/remove-linked-list-elements/

思路:链表遍历
   | c->next!=NULL
   删除节点
   | c->next=c->next->next;
   c++手动释放内存

代码实现:
     时间复杂度O(n);
     空间复杂度O(1);

/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* k=new ListNode(0,head);
        ListNode* c=k;
        while(c->next!=NULL){
            if(c->next->val==val){
                ListNode* d=c->next;
                c->next=c->next->next;//删除节点
                delete d;//释放内存
            }
            else{
                c=c->next;
            }
        }
        head = k->next;
        delete k;
        return head;
    }
};

收获摘要:链表题比较生疏,很少考虑手动释放内存()

学习的文章链接:https://programmercarl.com/0203.移除链表元素.html#其他语言版本

学习的视频链接:https://www.bilibili.com/video/BV18B4y1s7R9/?spm_id_from=333.788&vd_source=c2b246a405f861a2b3c13ab2b1b1eea6

707、设计链表

·就是这题,一下子给我干沉默了orz


题目链接:https://leetcode.cn/problems/design-linked-list/

感悟:越是难啃的题目,感觉收获越多(确信)
   模拟演算的过程真痛苦(泪)
   可以拆成五个小题,它合在一起了

思路:思考链表插入位置,先寻找,然后赋值(顺序是关键)

代码实现:

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() {//初始化
        _size=0;
        head = new ListNode(0);
    }
    
    //寻找第index个节点的值
    int get(int index) {//index节点的数据域,index从0开始算
        if(index<0||index>_size-1)return -1;
        ListNode* cur=head->next;
        while(index>0){
            cur=cur->next;
            index--;
        }
        return cur->val;
    }
    
    //在链表头前面插入val
    void addAtHead(int val) {//在链表头前插入一个节点,成为新的头节点
        ListNode* cur=new ListNode(val,head->next);//虚拟头指向的头节点,链表长度为0时则指向空指针
        head->next=cur;
        _size++;
    }
    
    //在链表尾后插入一个节点
    void addAtTail(int val) {
        ListNode* cur=head;
        while(cur->next!=nullptr){//找到链表尾
            cur=cur->next;
        }
        cur->next=new ListNode(val);//在链表末尾加上
        _size++;
    }
    
    //index长于链表长度时不插入(我直接根据题目描述写了,也可以只分成两种情况)
    void addAtIndex(int index, int val) {
        if(index==_size){//在链表尾后加节点
            addAtTail(val);
        }
        else if(index<=0){//在链表头前加节点
            addAtHead(val);
        }
        else if(index<_size){//在链表中间加节点
            ListNode* cur=head;
            ListNode* add=new ListNode(val);
            while(index>0){
                cur=cur->next;
                index--;
            }
            add->next=cur->next;
            cur->next=add;
            _size++;
        }

    }
    
    void deleteAtIndex(int index) {//删除index节点
        if(index>=0&&index<_size){
            ListNode* cur=head;
            while(index>0){
                cur=cur->next;
                index--;
            }
            ListNode* d=cur->next;
            cur->next=d->next;
            delete d;//释放内存
            _size--;//注意长度减小
        }
    }
    private:
    int _size;
    ListNode* head;//虚拟头节点,指向头节点
};

/**
 * 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);
 */

收获摘要:反复看视频,结合图像能对链表的查找、插入有更加清晰的认知。多加练习,还不够熟练。

学习的文章链接:https://programmercarl.com/0707.设计链表.html#代码

学习的视频链接:https://www.bilibili.com/video/BV1FU4y1X7WD/?spm_id_from=333.788&vd_source=c2b246a405f861a2b3c13ab2b1b1eea6

206、反转链表

·赋值的顺序是关键


我在死循环里迷了路……

题目链接:https://leetcode.cn/problems/reverse-linked-list/submissions/

思路:链表通过指针串联--线性结构
   链表在内存中不连续分布
   改变指针域改变链表方向
   有双指针法和递归法两种

代码实现:(双指针)
     时间复杂度O(n)
     空间复杂度O(1)

/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur=head;
        ListNode* pre=NULL;//直接是空指针
        while(cur!=nullptr){//注意循环边界
            ListNode* k=cur->next;
            cur->next=pre;//反转
            pre=cur;//pre前进
            cur=k;//cur前进,因为前面进行了反转,所以不能=pre,cur应该是k->next
        }
        return pre;//最后pre在链表尾,cur是nullptr,
    }
};

收获摘要:双指针+中间指针,三个指针就像星星在脑袋上旋转doge。有空再试试递归法(递归苦手)

学习的文章链接:https://programmercarl.com/0206.翻转链表.html#双指针法

学习的视频链接:https://www.bilibili.com/video/BV1nB4y1i7eL/?spm_id_from=333.788&vd_source=c2b246a405f861a2b3c13ab2b1b1eea6


学习时长:7h(orz)

有关代码随想录算法训练营第三天|203、移除链表元素|707、设计链表|206、反转链表的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  6. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

  7. ruby-on-rails - Rails 5,公寓和设计 : sign in with subdomains are not working - 2

    我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的

  8. ruby-on-rails - 设计中的 ArgumentError::RegistrationsController#new 错误的参数数量(2 代表 0..1) - 2

    我在关注RyanbatesRailsCast的devise和omniauth(第235集-devise-and-omniauth-revised)。当我尝试使用Twitter登录时,标题中不断出现错误。defself.new_with_session(params,session)ifsession["devise.user_attributes"]new(session["devise.user_attributes"],without_protection:true)do|user|user.attributes=paramsuser.valid?end完整跟踪:C:/Ruby20

  9. ruby-on-rails - 使用用户或管理员模型和 Basecamp 样式子域设计登录 - 2

    我为Devise用户和管理员提供了不同的模型。我也在使用Basecamp风格的子域。除了我需要能够以用户或管理员身份进行身份验证的一些Controller和操作外,一切都运行良好。目前我有authenticate_user!在我的application_controller.rb中设置,对于那些只有管理员才能访问的Controller和操作,我使用skip_before_filter跳过它。不幸的是,我不能简单地指定每个Controller的身份验证要求,因为我仍然需要一些Controller和操作才能被用户或管理员访问。我尝试了一些方法都无济于事。看来,如果我移动authentica

  10. ruby-on-rails - 自定义设计 Cookie - 2

    我在我的Rails应用程序中使用设计。我在租户庄园中配置了它,其中帐户/session的范围限定为子域。例如:http://subdomain1.example.com/http://subdomain2.example.com/...这很好用,但我想为“super管理员”添加一个子域,允许这些用户导航到所有其他子域而无需重新验证。这将是这样的:http://admin.example.com/是否可以自定义仅在管理子域上生成的cookie,以便它在所有其他子域上都有效? 最佳答案 Cookie域的定义越不具体,它们的包容性就越大,

随机推荐