代码随想录算法训练营第3天|链表理论基础、203. 移除链表元素、 707.设计链表、 206.反转链表

news/2024/9/23 3:53:57/

目录

  • 链表理论基础
  • 203. 移除链表元素
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析
  • 707. 设计链表
    • 1、题目描述
    • 2、思路
    • 3、code
  • 206. 反转链表
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析

链表理论基础

❤️链表增删的时间复杂度都是 O ( 1 ) O(1) O(1),适合动态增删;查询时间复杂度 O ( N ) O(N) O(N)不适合查询
🧡链表在内存中离散分布

做题的方法总结:

1️⃣ 虚拟头结点链表的结构就决定了要想操作某一节点就要知道前面的一个节点,但是头结点是没有前一个节点的,如果不想特殊化处理头节点,可以引入一个虚拟头节点,目的是让头节点也变成一般节点
2️⃣创建的cur指针指向要被操作的节点的前一个节点
3️⃣插入新节点时:要先连接后一个节点,再断开前一个节点
4️⃣改变某一个节点的指向时:要先使用temp指针保存该节点的下一节点,否则会造成后续节点丢失

203. 移除链表元素

题目链接:link

1、题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点
在这里插入图片描述

2、思路

链表移除某一个节点只需要将上一个节点的next指针指向下一个节点就行了
在这里插入图片描述

但是如果要移除头节点,头结点可是没有上一个节点的,所以要把头节点直接指向头节点的下一节点。
在这里插入图片描述

所以就要把所有节点分成两种情况:是头节点不是头结点

但是也可以用一种情况来实现删除操作:加入虚拟头结点 ,这样头结点也变成了一般节点。

3、code

class Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:# 使用虚拟头结点dummyhead = ListNode(-1) # 首先初始化虚拟头结点dummyhead.next = head # 让虚拟头结点的next指针指向头节点,这样就把头节点的处理变成了一般节点的处理cur = dummyhead # 令cur表示要删除的节点的前一个节点while cur.next != None:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummyhead.next 

❤️使用dummyhead保持在链表的最开始不动,cur来移动删除节点,最后返回dummyhead.next
💜 为啥不使用head?因为haed的值可能等于val,也会被删除

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( 1 ) O(1) O(1)

707. 设计链表

题目链接:link

1、题目描述

实现 MyLinkedList 类:
MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

2、思路

1️⃣ 插入节点:先连接后面的节点,再连接前面的节点
2️⃣删除节点:指针要指向被删除节点的前一个节点

3、code

class LinkNode:def __init__(self,val,next):self.val = valself.next = Noneclass MyLinkedList:def __init__(self):self.dummyhead = LinkNode(-1,None)self.size = 0# def print(self):#     cur = self.dummyhead#     for i in range(self.size):#         print(cur.next.val)#         cur = cur.nextdef get(self, index: int) -> int:if index >= self.size:return -1# 如果链表是1,2,3,返回index = 1,就是2cur = self.dummyhead.nextfor i in range(0,index):cur = cur.nextreturn cur.valdef addAtHead(self, val: int) -> None:new_node = LinkNode(val,None)new_node.next = self.dummyhead.nextself.dummyhead.next = new_nodeself.size += 1returndef addAtTail(self, val: int) -> None:self.addAtIndex(self.size,val)returndef addAtIndex(self, index: int, val: int) -> None:if index > self.size:return# 原来是1,3,加入index = 1cur = self.dummyheadfor i in range(index):cur = cur.nextnew_node = LinkNode(val,None)new_node.next = cur.nextcur.next = new_nodeself.size += 1returndef deleteAtIndex(self, index: int) -> None:if index >= self.size:return# 链表是1,2,3,删除index = 1,链表变成1,3cur = self.dummyheadfor i in range(index):cur = cur.nextcur.next = cur.next.nextself.size -= 1return# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)

206. 反转链表

题目链接:link

1、题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表

2、思路

双指针
在这里插入图片描述

3、code

class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:# 双指针方法# 首先初始化双指针cur = head # 先保存头结点pre = None # 因为头节点的反转下一个节点就是空节点 # 之后就是一节一节的反转链表,直到cur指向Nullwhile cur != None:temp = cur.next # 如果反转链表的next指向的话,会使得正向的指针消失,所以要先保存一下    cur.next = pre # 反转pre = cur # 要先后移precur = temp # 后移动curreturn pre

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( 1 ) O(1) O(1)


http://www.ppmy.cn/news/1529136.html

相关文章

LeetCode题练习与总结:回文链表--234

一、题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&#x…

【诉讼流程-健身房-违约-私教课-诉讼书提交流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(3)】

【诉讼流程-健身房-违约-私教课-诉讼书提交流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(3)】 1、前言说明2、流程说明3、现场提交(线下)4、网上提交1-起诉书样例2-起诉书编写(1)原告信息:&…

leetcode:最高乘法得分

用auto可以过 class Solution { public:long long maxScore(vector<int>& a, vector<int>& b) {int n b.size();vector<vector<long long>> memo(4,vector<long long>(b.size(), LLONG_MIN));auto dfs [&](auto&& dfs, i…

认识结构体

目录 一.结构体类型的声明 1.结构的声明 2.定义结构体变量 3.结构体变量初始化 4.结构体的特殊声明 二.结构体对齐(重点难点) 1.结构体对齐规则 2.结构体对齐练习 (一)简单结构体对齐 (二)嵌套结构体对齐 3.为什么存在内存对齐 4.修改默认对齐数 三.结构体传参 1…

KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用

KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用 KTH5762AQ3DNE 概述 KTH5762 是一款集成了高度匹配霍尔元件的3D (XY、 XZ 、 YZ 平面 ) 霍尔角度传感器&#xff0c;集成低功 耗&#xff0c;低噪声&#xff0c;高精度零漂运放&#xff0c;高性能&#xff…

IS-Net 教程:基于 PyTorch 的图像分割网络

IS-Net 教程&#xff1a;基于 PyTorch 的图像分割网络 IS-Net&#xff08;Image Structure Network&#xff09;是 DIS 项目 中的核心模块之一&#xff0c;用于进行复杂的图像结构化任务&#xff0c;尤其在图像分割、图像修复、去噪等任务中表现优异。本教程将介绍如何在 PyTo…

MySQL 数据库课程设计详解与操作示例

标题&#xff1a;MySQL 数据库课程设计详解与操作示例 简介 在数据库课程设计中&#xff0c;MySQL 是一个常用的关系型数据库管理系统 (RDBMS)。它以高效、稳定、易用而闻名&#xff0c;广泛应用于网站开发、数据分析和企业级应用中。本文将带你深入了解如何基于 MySQL 完成数…

电脑ip会因为换了网络改变吗

在当今数字化时代&#xff0c;IP地址作为网络世界中的“门牌号”&#xff0c;扮演着至关重要的角色。它不仅是设备在网络中的唯一标识&#xff0c;也是数据交换和信息传递的基础。然而&#xff0c;对于普通用户而言&#xff0c;一个常见的问题便是&#xff1a;当电脑连接到不同…