Day03|链表01:203.移除链表元素、707.设计链表、206.反转链表

这篇具有很好参考价值的文章主要介绍了Day03|链表01:203.移除链表元素、707.设计链表、206.反转链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天进入链表章节的学习了,也是之前学过的内容,这次争取快速AC。

203.移除链表元素

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

题意:删除链表中等于给定值 val 的所有节点。

示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

示例 2: 输入:head = [], val = 1 输出:[]

示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]

没什么好说的,这里注意引入了一个虚拟头节点dummy,这样就不用处理需要删除第一个节点的特殊情况。删除时C++需要手动detete。我本来使用free的,后来发现两者其实也是有区别的:详见文章new和malloc,delete和free的区别

new的底层也是通过malloc来开辟内存的,new比malloc多一项功能,就是开辟完内存,还可以进行初始化:

int *p=new int(10);

Test *p=new Test();

第一条语句是new的基本操作,10代表开辟整型内存的初始值。

第二条语句会在堆上开辟Test类型的一块内存,同时构造出一个对象。

以上两条malloc均办不到。

new开辟内存失败抛出bad_alloc类型的异常,要捕获异常才能判断内存是否分配成功。而malloc内存开辟失败返回的是NULL指针。

再谈谈delete和free:

delete比free多一项功能,就是不仅可以释放内存,还可以析构指针指向的对象。

还有一点要补充:

newdelete不仅仅是运算符,它们实际上是运算符重载函数的调用,对应的函数名是operator newoperator delete,可以在全局或者类的作用域中提供自定义的newdelete运算符的重载函数,以改变默认的malloc和free内存开辟释放行为。

然后删除的顺序,先让前一个节点指向要删除节点的后一个节点,再把要删的节点delete掉

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode *first = new ListNode(0);
        first->next = head;//虚拟头节点
        ListNode *p = first;//用于保存前节点的指
        while (p->next != NULL) {
            if (p->next->val == val) {
                ListNode *tmp = p->next;
                p->next = p->next->next;
                delete tmp; //这里不是free(p);

            } else {
                p = p->next;
            }
        }
        return first->next;
    }
};

707.设计链表

题目链接:力扣题目链接(opens new window)

这题难度不大,主要是链表基本操作的实现。重点如下:

  • 手撸链表的数据结构,我之前学的是C语言版,对于struct的比较熟悉,但C++需要补充一个构造函数和初始化函数,这样才可以new出对象。
  • 这个class的调用方式是这样的:

Day03|链表01:203.移除链表元素、707.设计链表、206.反转链表,链表,数据结构

这里使用new出一个MyLinkedList而不是我们自己创建的ListNode。然后使用其中的方法,简单来说就是包装吧。

class MyLinkedList {
public:
    struct ListNode{
        int val;
        ListNode* next;
        ListNode(int x):val(x),next(NULL){};//构造函数
    };
    //初始化链表,
    MyLinkedList() {
        _dummy = new ListNode(0);
        _size = 0;
    }
    
    int get(int index) {
        if(index >= _size || index < 0){
            return -1;
        }
        ListNode* cur = _dummy->next;//这里指向的是_dummy->next
        while(index--){
            cur = cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        ListNode* p = new ListNode(val);
        p->next = _dummy->next;
        _dummy->next = p;
        _size++;
    }
    
    void addAtTail(int val) {
        ListNode* p = new ListNode(val);
        ListNode* cur = _dummy;
        while(cur->next != nullptr){
            cur = cur->next;
        }
        cur->next = p;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        ListNode *p = new ListNode(val);
        ListNode* cur = _dummy;//这里指向_dummy,因为我们要的效果是循环结束后cur停在对于节点的前面
        if(index > _size){
            return;//index大于链表长度,不插入
        }
        while(index--){
            cur = cur->next;
        }
        p->next = cur->next;
        cur->next = p;
        _size++;
    }
    
    void deleteAtIndex(int index) {
        if(index >= _size || index < 0){
            return;
        }
        ListNode* cur = _dummy;
        while(index--){
            cur = cur->next;
        }
        ListNode* temp = cur->next;
        cur->next = cur->next->next;
        delete temp;
        _size--;
    }
private:
    ListNode* _dummy;
    int _size;
};

206.反转链表

题目链接:力扣题目链接(opens new window)

题解:题解

Day03|链表01:203.移除链表元素、707.设计链表、206.反转链表,链表,数据结构

这里使用双指针,用pre节点保存cur的前一个节点,注意顺序:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
//        ListNode* dummy = new ListNode(0);
//        dummy->next = head;
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur != nullptr){
            ListNode* tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
};

这里不需要创建虚拟头节点了,因为对head节点的处理是一样的,不需要特殊处理。

递归法没怎么看,今天有点忙,有时间再看,感觉跟双指针的思路是一样的。文章来源地址https://www.toymoban.com/news/detail-581152.html

到了这里,关于Day03|链表01:203.移除链表元素、707.设计链表、206.反转链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • day3_203移除链表元素_707设计链表_206反转链表

    链表是一种通过指针串联起的线性结构,每个节点由两部分组成: 一个数据域,一个指针域(存放指向下一节点的指针),最后一个节点的指针域指向null。 链表入口节点是头结点head。 双链表:两个指针域,指向下一节点和上一节点。( 向前向后查询) 循环链表:首尾相连

    2024年02月16日
    浏览(32)
  • day3-链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

    单链表 双链表:每个节点有两个指针域,一个指向下一个节点,一个指向上一个节点 既可以查询前一个节点,又能查询后一个节点 循环列表:链表首尾相连 在内存上 不是连续分布 的,散乱分布在内存中的某地址上 删除节点:next指针直接指向下下个节点,且在内存中删除

    2024年02月04日
    浏览(32)
  • 代码随想录day3 | 203.移除链表元素 707.设计链表 206.反转链表

    直接让前一个节点指向后一个节点即可 两种方法 第一种:直接删除 第二种:头删的时候,直接 head=head-next 其实这两种方法都没有做到统一 第三种:虚拟头结点法 这样的话,咱们删除的时候,就是以统一的规则来进行删除啦! 203.移除链表元素 法一:原始删除法 1、while(h

    2024年02月16日
    浏览(36)
  • 【LeetCode题目详解】 203. 移除链表元素707. 设计链表206. 反转链表 day3(补)

    题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [], val = 1 输出:[] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:[] 看到这道题就想到了链表 这道题有两种写法,涉及如下链表操作的两种方式: 直接使用

    2024年02月16日
    浏览(41)
  • 代码随想录Day3|链表理论基础|203.移除链表元素|707.设计链表|206.反转链表

    虽然以前写过一次链表,但是真的已经忘得一干二净了 链表 :通过 指针 串联在一起的线性结构,每个 节点 都由数据域和指针域组成。 指针域 :存放下一个节点的指针,最后一个节点的指针域指向null,也即空指针 head :链表的入口节点,也即链表的头节点 链表的类型 单

    2024年02月11日
    浏览(52)
  • 刷题日记 Day 3 : Leetcode 203 . 移除链表元素、Leetcode 707 . 设计链表、Lettcode 206 . 反转链表

    本篇文章 , 是在代码随想录 60 天编程挑战的基础上进行的题目讲解 参与链接在此 : https://programmercarl.com/other/xunlianying.html 大家好 , 这个专栏 , 给大家带来的是 60 天刷题强训 . 最令大家头疼的事就是刷题了 , 题目又臭又长又抽象 , 有的题读都读不懂 , 更别说做了 . 所以 , 这个

    2023年04月09日
    浏览(50)
  • 203.移除链表元素&707.设计链表& 206.反转链表

    203.移除链表元素: 给你一个链表的头节点  head  和一个整数  val  ,请你删除链表中所有满足  Node.val == val  的节点,并返回  新的头节点  。 707.设计链表  : 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。

    2024年02月11日
    浏览(34)
  • 203.移除链表元素|707.设计链表|206.反转链表

    203. 移除链表元素 这里以链表 1 4 2 4 来举例,移除元素4。 如果使用C,C++编程语言的话,不要忘了还要从内存中删除这两个移除的节点, 清理节点内存之后如图: 其实 可以设置一个虚拟头结点 ,这样原链表的所有节点就都可以按照统一的方式进行移除了。 来看看如何设置

    2024年02月11日
    浏览(41)
  • 算法训练第三天|203.移除链表元素、707.设计链表、206.反转链表

    题目链接:力扣 思路:删除链表元素与数组不同之处在于,它需要被删除链表元素的前一个元素和后一个元素的参与,而不需要其他元素的参与。 我们使被删除元素前一个元素的指针指向被删除元素的后一个元素 ,也就是直接跳过被删除的元素,来实现删除。 同时我们考

    2024年02月05日
    浏览(38)
  • 【代码随想录刷题记录】 203.移除链表元素 、 707.设计链表 、206.反转链表

    题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 题目链接:https://leetcode.cn/problems/remove-linked-list-elements/ 代码 小结 该题主要注意链表删除的操作以及在特殊情况下如何进行操作。特殊情况包括头结点为目标

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包