代码随想录刷题题Day3

news2025/1/22 9:19:11

刷题的第三天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++ / Python
Day3 任务
● 链表理论基础
● 203.移除链表元素
● 707.设计链表
● 206.反转链表

1 链表理论基础

链表:通过指针串联在一起的线性结构,每个节点由指针域数据域组成。
指针域:存放指向下一个节点的指针,最后一个节点的指针域指向null
数据域:节点存放着数据

(1)链表的类型

  1. 单链表
    每个节点的指针域指向下一个节点
    在这里插入图片描述
  2. 双链表
    每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点

可以双向查询

在这里插入图片描述

  1. 循环链表
    链表首尾相连,可以用来解决约瑟环问题
    在这里插入图片描述

(2)链表的存储方式
链表在内存中不是连续分布的(区别于数组)

通过指针域的指针链接内存中的各个节点,散乱分布在内存的某地址上,分配机制取决于操作系统的内存管理

(3)链表的定义
C++的定义链表节点方式

struct ListNode
{
	int val;
	ListNode* next;
	ListNode(int x) : val(x), next(NULL) {}
};

如果不自己定义构造函数初始化节点:

ListNode* head = ListNode();
head->val = 5;

采用上面自己定义的构造函数初始化节点可以直接给变量赋值:

ListNode* head = ListNode(5);

Python的定义链表节点方式

class ListNode:
	def __init__(self, val, next=None):
		self.val = val
		self.next = next

(4)链表的操作

  1. 删除节点
    在这里插入图片描述

将C节点的指针指向E,就间接删除了D,C++需要自己手动释放内存,Python不需要自己手动释放内存

  1. 添加节点
    在这里插入图片描述

C节点指向新节点,新节点指向D节点,就完成了在C和D节点之间插入了新节点。

(5)链表与数组的区别

  • 数组在定义的时候,长度是固定的,如果需要改变数组的长度,需要重新定义一个新的数组
  • 链表的长度可以是不固定的,动态增删,适合数据量不固定,频繁增删,少查询的场景
插入/删除查询适用场景
数组O(n)O(1)数据量固定,频繁查询,较少插入和删除的场景
链表O(1)O(n)数据量不固定,较少查询,频繁插入和删除的场景

2 移除链表元素

在这里插入图片描述

C++编程语言需要自己手动删除清理节点的内存
Python就不用手动管理内存了

😀因为单链表的特殊性,只能指向下一个节点,如果删除的是头节点怎么办?如何让头节点的前一个节点指向头节点的下一个节点。

有两种处理方式:
(1)直接使用原来的链表进行删除操作:分两步操作1.删除头节点2.删除除了头节点的其他节点
在这里插入图片描述
只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点,依然别忘将原头结点从内存中删掉在这里插入图片描述
在这里插入图片描述

(2)设置一个虚拟头节点进行删除操作 : 原链表的所有节点就都可以按照统一的方式进行移除了
在这里插入图片描述

  1. 直接使用原来的链表来进行移除节点操作
    在这里插入图片描述

C++:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头节点
		while (head != NULL && head->val == val)
		{
			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;
    }
};

Python:

class Solution(object):
    def removeElements(self, head, val):
        """
        :type head: ListNode
        :type val: int
        :rtype: ListNode
        """
        while head != None and head.val == val:
            head = head.next
        cur = head
        while cur != None and cur.next != None:
            if cur.next.val == val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return head

  1. 设置一个虚拟头结点在进行移除节点操作
    在这里插入图片描述

C++:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyhead = new ListNode(0);
        dummyhead->next = 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;
    }
};

Python:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def removeElements(self, head, val):
        """
        :type head: ListNode
        :type val: int
        :rtype: ListNode
        """
        dummyhead = ListNode(next = head)
        cur = dummyhead
        while cur.next:
        	if cur.next.val == val:
        		cur.next = cur.next.next
        	else:
        		cur = cur.next
        return dummyhead.next

3 设计链表

在这里插入图片描述

实现 MyLinkedList 类:

class MyLinkedList 
{

};

链表定义:

struct ListNode {
	int val;
	ListNode* next;
	ListNode(int x) : val(x), next(NULL) {}
};

定义两个私有成员:

private:
	int _size;
	ListNode* _dummyhead; // 虚拟头节点
  1. MyLinkedList() 初始化 MyLinkedList 对象。
MyLinkedList()
{
	_dummyhead = new ListNode(0);
	_size = 0;
}
  1. int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
int get(int index) {
	if (index < 0 || index > size - 1) return -1;
	ListNode* cur = _dummyhead->next;
	while (index--)
	{
		cur = cur->next;
	}
	return cur->val;
}
  1. void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtHead(int val) {
	ListNode* newNode = new ListNode(val);
	newNode->next = _dummyhead->next;
	_dummyhead->next = newNode;
	_size++;
}
  1. void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtTail(int val) {
	ListNode* cur = _dummyhead;
	ListNode* newNode = new ListNode(val);
	while (cur->next != NULL)
	{
		cur = cur->next;
	}
	cur->next = newNode;
	_size++;
}
  1. void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void addAtIndex(int index, int val) {
	if (index < 0) index = 0;
	if (index > _size) return;
	ListNode* newNode = new	ListNode(val);
	ListNode* cur = _dummyhead;
	while (index--)
	{
		cur = cur->next;
	}
	newNode->next = cur->next;
	cur->next = newNode;
	_size++;
}
  1. void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。
void deleteAtIndex(int index) {
	if (index < 0 || index >= _size) return;
	ListNode* cur = _dummyhead;
	while (index--)
	{
		cur = cur->next;
	}
	ListNode* tmp = cur->next;
	cur->next = cur->next->next;
	delete tmp;
	tmp = NULL;
	_size--;
}

C++:

class MyLinkedList {
public:
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};
    MyLinkedList() {
        _dummyhead = new ListNode(0); // 虚拟头结点
        _size = 0;
    }
    // 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
    int get(int index) {
        if (index < 0 || index > _size - 1) return -1;
        ListNode* cur = _dummyhead->next;
        while (index--)// 如果--index 就会陷入死循环
        {
            cur = cur->next;
        }
        return cur->val;
    }
    // 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
    void addAtHead(int val) {
        ListNode* newNode = new ListNode(val);
        newNode->next = _dummyhead->next;
        _dummyhead->next = newNode;
        _size++;
    }
     // 在链表最后面添加一个节点
    void addAtTail(int val) {
        ListNode* newNode = new ListNode(val);
        ListNode* cur = _dummyhead;
        while(cur->next != NULL){
            cur = cur->next;
        }
        cur->next = newNode;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        if (index < 0) index = 0; // 如果index小于0,则在头部插入节点
        if (index > _size) return; // 如果index大于链表的长度,则返回空
        ListNode* newNode = new ListNode(val);
        ListNode* cur = _dummyhead;
        while (index--)
        {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
        _size++;
    }
    // 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
    void deleteAtIndex(int index) {
        if (index >= _size || index < 0) return;
        ListNode* cur = _dummyhead;
        while (index--)
        {
            cur = cur->next;
        }
        ListNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
        tmp = NULL;
        _size--;
    }
private:
    int _size;
    ListNode* _dummyhead;
};

4 反转列表

在这里插入图片描述
(1)双指针
只需要改变链表的next指针的指向,直接将链表反转
在这里插入图片描述
在这里插入图片描述
伪代码:

cur = head;
pre = NULL;
// 移动pre和cur指针 注意下面的逻辑顺序
while (cur != NULL)
{
	tmp = cur->next;
	cur->next = pre;
	pre = cur;
	cur = tmp;
}
return pre; // 返回头节点

C++:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* pre = NULL;
        while (cur != NULL)
        {
        	ListNode* tmp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next
        	cur->next = pre;// 翻转
        	// 更新pre 和 cur指针
        	pre = cur;
        	cur = tmp;
        }
        return pre;
    }
};

Python:

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        cur = head
        pre = None
        while cur != None:
            tmp = cur.next
            cur.next = pre
            pre = cur
            cur = tmp
        return pre

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
(2)递归
相对抽象,和双指针法是一样的逻辑
C++:

class Solution {
public:
	ListNode* reverse(ListNode* pre, ListNode* cur)
	{
		if (cur == NULL) return pre;
		ListNode* tmp = cur->next;
		cur->next = pre;
		// pre = cur;
        // cur = temp;
		return reverse(cur, temp);
	}
    ListNode* reverseList(ListNode* head) {
        // 和双指针法初始化是一样的逻辑
        reverse(NULL, head);
    }
};

Python:

class Solution(object):
    def reverseList(self, head):
        return self.reverse(head,None)
    def reverse(self, cur, pre):
        if cur == None:
            return pre
        tmp = cur.next
        cur.next = pre
        return self.reverse(tmp, cur)

今天真是搞了不少时间,鼓励坚持三天的自己😀😀😀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1279857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ArcGIS Pro微课1000例】0045:深度学习--车牌模糊

借助ArcGIS Pro提供的车牌模糊训练模型,可以很方便实现车牌模糊。 文章目录 一、车牌模糊对比二、工具介绍三、案例实现一、车牌模糊对比 车牌模糊前: 车牌模糊后: 二、工具介绍 本功能使用的依然是ArcGIS Pro提供的深度学习工具中的使用深度学习分类像素(Classify Pixel…

【PUSDN】java中easyexcel导入导出带有图片的Excel(main方法方式)

简述 java中easyexcel导入导出带有图片的Excel&#xff08;main方法方式&#xff09;&#xff0c;web方式详见另一篇 由于电脑音频问题&#xff0c;视频暂时没有解说声音&#xff0c; 回头重新补上 前情提示 如果有任何疑问、需求、技术支持&#xff0c;欢迎点赞&#xff0…

智能优化算法应用:基于松鼠算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于松鼠算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于松鼠算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.松鼠算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

精准长尾关键词批量挖掘工具,长尾关键词挖掘正确使用方法

互联网时代&#xff0c;SEO已然成为网站推广的关键一环。而在SEO的世界里&#xff0c;长尾关键词无疑是一块被广泛忽视却蕴含着巨大潜力的宝地。 什么是长尾关键词 长尾关键词&#xff0c;指的是那些相对不那么热门、搜索量较低但更为具体、更贴近用户真实需求的关键词。与短…

Knowledge Review(CVPR 2021)论文解析

paper&#xff1a;Distilling Knowledge via Knowledge Review official implementation&#xff1a;https://github.com/dvlab-research/ReviewKD 前言 识蒸馏将知识从教师网络转移到学生网络&#xff0c;可以提高学生网络的性能&#xff0c;作为一种“模型压缩”的方法被…

vscode调试mit6s081Lab

环境 mit6.s081的实验环境gdb-multiarch&#xff08;用于gdb调试&#xff0c;vscode调试实质上就是提供个图形化页面&#xff0c;底层还是这个&#xff09; // 安装 gdb-multiarch sudo apt-get install gdb-multiarch大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为…

css如何设置文本添加下划线

css文本添加下划线 text-decoration: underline;text-decoration相关属性参数 参数描述none默认。定义标准的文本。underline定义文本下的一条线。overline定义文本上的一条线。line-through定义穿过文本下的一条线。blink定义闪烁的文本。inherit规定应该从父元素继承 text-…

组件的props属性

目录 1&#xff1a;使用props的作用&#xff1a; 2&#xff1a;props自定义属性的用法&#xff1a; 3&#xff1a;集合v-bind使用自定义属性&#xff1a; 4&#xff1a;props自定义属性是只读的&#xff1a; 5&#xff1a;default默认值&#xff1a; 6&#xff1a;type值类…

文件操作--IO

目录 ♫什么是文件 ♫文件路径 ♫文件类型 ♫文件的管理 ♪File的构造方法 ♪File的常用方法 ♫文件的内容操作 ♪InputStream ♪OutputStream ♪字符流读写文件 ♫Scanner与流对象 ♫什么是文件 文件在计算机里可以指“狭义”的文件&#xff08;指硬盘上的文件和目录&…

深层神经网络(第四周)

这里省略了深层神经网络的前向传播和反向传播&#xff0c;内容和之前相似&#xff0c;不做过多描述。若今后需要&#xff0c;可以再补习。 一、为什么使用深层表示 解决问题时其实并不需要很大的神经网络&#xff0c;但是得有深度&#xff0c;得有比较多的隐藏层。这是为什么…

LeetCode(49)用最少数量的箭引爆气球【区间】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 用最少数量的箭引爆气球 1.题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [x_start, x_end] 表示水平直径在 x_start 和 x_end之间的气球。你不知道气…

基于OpenAPI工具包以及LSTM的CDN网络流量预测

基于LSTM的CDN网络流量预测 本案例是基于英特尔CDN以及英特尔 OpenAPI Intel Extension for TensorFlow* Intel oneAPIDPC Library 的网络流量预测&#xff0c;CDN是构建在现有网络基础之上的智能虚拟网络&#xff0c;目的是将源站内容分发至最接近用户的节点&#xff0c;使用…

【JVM】一篇通关JVM类加载与字节码技术

目录 1. 类文件结构1-1. 魔数 版本 常量池 2. 字节码指令3. 编译期处理4. 类加载阶段5. 类加载器6. 运行期优化 类加载与字节码技术 1. 类文件结构 案例 // HelloWorld 示例 public class HelloWorld {public static void main(String[] args) {System.out.println("h…

淘宝商家店铺注册流程

如果本身已经有淘宝账号了&#xff0c;直接从第三步骤&#xff1a;创建店铺开始就可以了。一、注册淘宝账号、支付宝账号 首先,如果你有买家账号,是可以直接拿来开店的&#xff0c;不用单独在注册淘宝账号开店。 注意事项: 1:淘宝账号注册后,不能修改,如果会员名有写错情况&a…

创意项目开源,文生图、排序/优选等...,持续开源更新!!

热烈欢迎大家在git上star&#xff01;&#xff01;&#xff01;冲鸭&#xff01;&#xff01;&#xff01; 1.dalle1在厨房家具中文场景上训练。 GitHub - leeguandong/DALLE1: dalle1在中文家具场景的微调&#xff0c;效果并不好dalle1在中文家具场景的微调&#xff0c;效果…

Centos7安装GItLab(在线版)

基础环境准备 1.配置清华大学镜像仓库 新建仓库配置文件使用 vim /etc/yum.repos.d/gitlab-ce.repo 命令&#xff0c;输入以下内容,保存 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabl…

拥抱变化,良心AI工具推荐

文章目录 &#x1f4a5; 简介&#x1f344; 工具介绍&#x1f353; 功能特点&#x1f957; 使用场景&#x1f389; 用户体验&#x1f9e9; 下载地址&#x1f36d; 总结 &#x1f4a5; 简介 我是一名资深程序员&#xff0c;但薪资缺对不起资深两个字&#xff0c;为了生存&#x…

Golang 原生Rpc Server实现

Golang 原生Rpc Server实现 引言源码解析服务端数据结构服务注册请求处理 客户端数据结构建立连接请求调用 延伸异步调用定制服务名采用TPC协议建立连接自定义编码格式自定义服务器 参考 引言 本文我们来看看golang原生rpc库的实现 , 首先来看一下golang rpc库的demo案例: 服…

百度收录批量查询工具,免费SEO优化排名工具

拥有一个在搜索引擎中得到良好收录的网站对于个人和企业都至关重要。而百度&#xff0c;作为中国最大的搜索引擎&#xff0c;其收录情况直接影响着网站的曝光度和流量。 百度搜索引擎是中文用户获取信息的重要途径之一。而在这个竞争激烈的网络环境中&#xff0c;了解自己网站…

Rust国内sparse镜像源配置

文章目录 1. 遇到问题1.1 问题现象1.2 解决办法 2. 重新设置最新 sparse源3. 更多参考资料3.1 字节源3.2 ustc 源3.3 清华源3.4 其他人的总结 1. 遇到问题 有好一阵子没有更新源和安装软件了&#xff0c; 使用ustc的源&#xff0c; 更新了好一阵子&#xff0c; 最后安装居然还出…