IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Day3 算法训练营 -> 正文阅读

[数据结构与算法]Day3 算法训练营

LeetCode:203.移除链表元素

1、方法1:直接使用原来的链表来进行删除操作

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头结点
        while (head != NULL && head->val == val) { // 注意这里不是if
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

        // 删除非头结点
        ListNode* cur = head;
        while (cur != NULL && cur->next!= NULL) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};

1.1 删除头节点的元素

while(head != NULL && head->value == target)
  • 问题:为什么要判断头节点不为空呢?
    因为接下来要取头结点的值,如果头节点是空那么就相当于操作空指针了。
  • 问题:为什么是while而不是if
    假设有一串链表包含5个节点,每个节点的value都是1,而target也是1,那么就相当于要做5次移除头节点的工作。如果是if的话,其实只会做一次。用while的话,就相当于直到满足第一个节点的值不等于target为止

1.2 从内存中释放旧节点
如果使用C,C++编程语言的话,需要手动释放内存。其他语言的代码就不需要手动释放内存,会自动释放。

ListNode* tmp = head;
delete tmp;

还要说明一下,就算使用C++来做leetcode,如果移除一个节点之后,没有手动在内存中删除这个节点,leetcode依然也是可以通过的,只不过,内存使用的空间大一些而已,但建议依然要养成手动清理内存的习惯。

1.3 删除非头结点元素
先定义一个临时指针cur = head

  • 问题:为什么定义cur = head,而不直接使用head操作
    答:因为最后要返回head头指针,这样其他人才能找到这个删除后的链表。如果不这么做,而是直接移动头指针,最后就找不到这个链表了。
    所以在遍历链表的时候,都需要定义一个临时指针
  • 问题:为什么定义cur = head,而不是等于head->next
    答:单链表删除的操作,是通过找到被删除节点前一个结点,然后让他直接指向被删除结点下一个结点来实现的

1.4 理解链表的两句话
cur = cur->next;移动cur指针,让cur指针指向链表下一个结点
cur->next = cur->next->next;不移动cur指针,但是改变cur指针指向结点后面跟随的结点,修改结点指针域,让其指向下下个结点。

2、方法2:设置一个虚拟头结点在进行移除节点操作

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

定义一个结点,让这个结点指向链表的头节点
问题:为什么要再写head = dummyHead->next;
答:因为head指向的是链表第一个结点,这个结点可能已经被我们删掉了,而且我们没有改变head指针的指向。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:25:10  更:2022-10-31 12:26:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:43:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码