Golang leetcode707 设计链表 (链表大成)

文章目录

  • 设计链表 Leetcode707
    • 不使用头节点
    • 使用头节点 推荐**

设计链表 Leetcode707

题目要求我们通过实现几个方法来完成对链表的各个操作
由于在go语言中都为值传递,(注意这里与值类型、引用类型的而区别),所以即使我们直接在方法中传入指针,但是我们在方法里是不能直接修改指针所改的地址,其在方法中只会复制一份副本进行操作,而不会影响到原变量。
所以我们这里可以设置一个结构体,在mylinkedlist中在定义链表节点进行解决。
关于值传递的注意事项

这里放一个经典的愚蠢案例以作警戒,妄想通过副本直接影响原链表
我是猪

func (this *MyLinkedList) AddAtTail(val int) {Node := this.Headif Node == nil {Node = &ListNode{Val: val}//this.Head = Nodereturn}for Node.Next != nil {Node = Node.Next}Node.Next = &ListNode{Val: val}
}

不使用头节点

// ListNode 定义链表结构
type ListNode struct {Val  intNext *ListNode
}//正常建立,不涉及头节点
// MyLinkedList 为了方便操作链表建立的结构体
type MyLinkedList struct {size intHead *ListNode
}// Constructor 初始化链表对象 √
func Constructor() MyLinkedList {return MyLinkedList{}
}// Get 获取第index个节点的数据 √
func (this *MyLinkedList) Get(index int) int {if index+1 > this.size {return -1}Node := this.Headfor ; index > 0; index-- {Node = Node.Next}return Node.Val
}// AddAtHead 将数据为val的节点添加到第一位 √
func (this *MyLinkedList) AddAtHead(val int) {Node := &ListNode{Val: val, Next: this.Head}this.Head = Nodethis.size++
}// AddAtTail 将数据为val的节点添加到最后一位 √
func (this *MyLinkedList) AddAtTail(val int) {this.size++if this.Head == nil {this.Head = &ListNode{Val: val}return}Node := this.Headfor Node.Next != nil {Node = Node.Next}Node.Next = &ListNode{Val: val}
}// AddAtIndex 将数据为val的节点插入到第index个节点之前;若链表长度为index,则放置到最后一位;若超过链表长度不做修改 √
func (this *MyLinkedList) AddAtIndex(index int, val int) {if this.size == index {this.AddAtTail(val)return}if this.size < index {return}//有第index节点//如果index=0,则需要改动首结点,直接待用addAtHeadif index == 0 {this.AddAtHead(val)return}cur := this.HeadNode := cur//0 1 2 3	;index=2for ; index > 1; index-- {Node = Node.Next}Node.Next = &ListNode{Val: val, Next: Node.Next}this.Head = curthis.size++
}// DeleteAtIndex 删除第index个节点
func (this *MyLinkedList) DeleteAtIndex(index int) {if index+1 > this.size {return}// 0 1 2 3	;index=0//如果index=0,依旧需要修改头节点if index == 0 {this.Head = this.Head.Nextthis.size--return}Node := this.Headcur := Node0 1 2 3	;index=3,删除最后一个,只需要将最后.next=nil//if index+1 == this.size {//	for ; index > 1; index-- {//		cur = cur.Next//	}//	cur.Next = nil//	this.Head = Node//	this.size--//	return//}//0 1 2 3	;index=2//for ; index > 1; index-- {//	cur = cur.Next//}//cur.Next = cur.Next.Next//this.Head = Node//this.size--for ; index > 1; index-- {cur = cur.Next}if index+1 == this.size {cur.Next = nilthis.size--return}cur.Next = cur.Next.Nextthis.Head = Nodethis.size--
}

使用头节点 推荐**

首先性能足够优秀,而且代码简洁还方便
在这里插入图片描述

//本次目标时建立具有 头节点 的链表(虚拟头节点,但实际就是有头节点)
//链表结构:H* 0 1 2 3
//优势,在对头节点后的节点进行操作会方便type MyLinkedList struct {Size      intDummyHead *ListNode
}// Constructor 使用虚拟头节点时,很关键的一步在在初始化我们的mylinkedlist,我们需要直接对dummyhead分配内存空间,防止后续对首个节点进行操作时出现问题
func Constructor() MyLinkedList {return MyLinkedList{DummyHead: &ListNode{}}
}func (this *MyLinkedList) Get(index int) int {//*h 0 1 2 3	;0if this.Size <= index {return -1}DummyHead := this.DummyHeadcur := DummyHeadfor ; index >= 0; index-- {cur = cur.Next}return cur.Val
}func (this *MyLinkedList) AddAtHead(val int) {//if this.Size == 0 {//	this.Head = &ListNode{Next: &ListNode{Val: val}}//	this.Size++//} else {//	this.Head.Next = &ListNode{Val: val, Next: this.Head.Next}//	this.Size++//}//newNode := &ListNode{Val: val} // 创建新节点//newNode.Next = this.Head.Next  // 新节点指向当前头节点//this.Head.Next = newNode       // 新节点变为头节点//this.Size++                    // 链表大小增加1//上面第一块没想明白,逻辑有问题;第二部分进行整合,本质一样this.DummyHead.Next = &ListNode{Val: val, Next: this.DummyHead.Next}this.Size++
}func (this *MyLinkedList) AddAtTail(val int) {if this.Size == 0 {this.AddAtHead(val)return}DummyHead := this.DummyHeadcur := DummyHead//h* 0 1 2 3 4	;for cur.Next != nil {cur = cur.Next}cur.Next = &ListNode{Val: val}this.DummyHead = DummyHeadthis.Size++
}func (this *MyLinkedList) AddAtIndex(index int, val int) {//如果index=链表长度,插入到末尾if this.Size == index {this.AddAtTail(val)return}//如果index>链表长度,什么都不做//<长度,插入到index节点前//h* 0 1 2 3 4	;2if this.Size > index {DummyHead := this.DummyHeadcur := DummyHeadfor ; index > 0; index-- {cur = cur.Next}cur.Next = &ListNode{Val: val, Next: cur.Next}this.DummyHead = DummyHeadthis.Size++}}func (this *MyLinkedList) DeleteAtIndex(index int) {//h* 0 1 2 3 4	;0if this.Size > index {DummyHead := this.DummyHeadcur := DummyHeadfor ; index > 0; index-- {cur = cur.Next}cur.Next = cur.Next.Nextthis.DummyHead = DummyHeadthis.Size--}}

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

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

相关文章

Apache Doris (五十五): Doris Join类型 - Colocation Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Colocation Join原理

UTF-8编码详解

UTF-8编码详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一起深入探讨编程中常见的字符编码方式之一——UTF-8。作为一种广泛使用的字符…

MFC消息机制详细剖析

易语言程序的破解99%的时候都需要用到FF55FC5F5E这个特征码 新建一个MFC应用程序&#xff1a; 去编辑MFC的.rc资源文件来DIY窗体 静态编译的&#xff0c;把很多静态库的代码都添加进去了 &#xff0c;所以速度很慢 消息机制针对的是GUI程序&#xff08;比如窗口程序&#xf…

基于UDP的网络编程

UDP服务端 #ifdef _WIN32 #define _WINSOCK_DEPRECATED_NO_WARNINGS #define close closesocket #include <winsock2.h> #else #include <arpa/inet.h> #include <netdb.h> #include <netinet/in.h> #in…

leetcode中sql题目分类与总结

基础50题 聚合函数 项目员工&#xff0c;连接 avg group by各项函数用户的注册率&#xff1a;直接单表操作&#xff0c;count函数的使用&#xff0c;结合round进行保留小数。1211. 查询结果的质量和占比&#xff1a;简单的avg, sum(if(,,))的使用1193. 每月交易 I&#xff…

高颜值的第三方网易云播放器

嗨喽&#xff01;GitHub科技的各位小伙伴们&#xff0c;为了能够第一时间及时送达到大家手上&#xff0c;大家记得给博主点点关注每天会送上各种好评技术干货推文 &#xff01; 本期推荐开源项目目录&#xff1a; YesPlayMusic eDEX-UI&#xff1a;超炫酷终端工具 Calculato…

微软开源,全平台通用:Shell 自动补全工具 | 开源日报 No.132

microsoft/inshellisense Stars: 7.6k License: MIT inshellisense 是一个为 Shell 提供 IDE 风格自动补全的工具。它是一个终端本地运行时自动完成&#xff0c;支持 600 多个命令行工具&#xff0c;并且可以在 Windows、Linux 和 macOS 上使用。主要功能包括安装后可通过运行…

FTP的基本介绍

FTP ftp的介绍&#xff1a; ftp是一个可以提供共享文件的服务器&#xff0c;他可以通过iis.msc也就是windows 的服务器管理器来打开&#xff0c;或者通过cmd命令行打开 如何使用iis.msc打开ftp&#xff0c;如何使用cmd打开ftp &#xff0c;如何匿名登录ftp&#xff0c;ftp和…

Android Studio实现课表

本文章主要展示课表的实现&#xff0c;里面包含很多控件的用法&#xff0c;比如吐司Toast、通知Notification、ListView&#xff0c;数值选择器NumberPicker&#xff0c;SeekBar同editText的关联。抽屉导航栏 还有一些其他的功能&#xff0c;比如InputFilter自定义的字符过滤器…

C语言中的递归函数的简单应用

C语言中的递归函数的简单应用 递归函数简介注意 使用示例求n的阶乘分析问题&#xff1a;代码示例&#xff1a; 求Fibonacci数列分析问题&#xff1a;代码示例 求最大公约数分析问题&#xff1a;代码一&#xff1a;辗转相减法&#xff1a;代码二&#xff1a;辗转相除法&#xff…

第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串

文章目录 第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串使用 J 链接类型传递标准计数字符串使用 J 连接传递字符串 第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串 使用 J 链接类型传递标准计数字符串 iris-callin.h 头文件定义了计…

SSM框架(Spring + SpringMVC + Mybatis)

MVC即model view controller。&#xff08;模型&#xff0c;视图&#xff0c;控制器&#xff09; entity层(model层&#xff0c;domain层) 用于存放我们的实体类&#xff0c;类中定义了多个类属性&#xff0c;并与数据库表的字段保持一致&#xff0c;一张表对应一个类。主要用…

排序整形数组--------每日一题

大家好这是今年最后的一篇了&#xff0c;感谢大家的支持&#xff0c;新的一年我会更加努力地。 文章目录 目录 文章目录 题⽬描述&#xff1a; 输⼊10个整数&#xff0c;然后使⽤冒泡排序对数组内容进⾏升序排序&#xff0c;然后打印数组的内容 一、题目解读 冒泡排序是⼀种基础…

用Qt开发的十大理由

#1 完美的用户体验 “就最终体验、性能和特性而言,Qt 绝对是开发Radeon SoftwareCrimson Edition的正确选择。”“MBUS 是梅赛德斯-奔驰汽车内的全新用户体验。我们用 Qt 开发了绝大部分的UI体验和软件,包括屏幕动画,屏幕间的过渡和小组件。Qt 使我们能够快速开发出原型系统…

[verilog] 免费开源的 verilog 仿真工具:icarus verilog

主页: 元存储博客 文章目录 前言1. 下载2. 安装3. 安装成功?4. 使用总结前言 知名的Verilog仿真工具主要为三大主流的产品:mentor的modelsim/questasim,candence的NC-verilog,synopsys的VCS。但都不是免费的,所以我一个都不讲。 作为verilog入门学习的仿真工具,有时候…

Linux进行模型微调前的环境准备

在Linux机器上对模型进行微调前&#xff0c;首先需要准备环境&#xff0c;即安装相关的软件。因为linux是一个无界面操作系统&#xff0c;软件安装完成后&#xff0c;还需要有便捷的交互方式编写脚本&#xff0c;调试脚本。此篇博客将专门介绍如何快速安装所需依赖软件&#xf…

2023-12-25 LeetCode每日一题(不浪费原料的汉堡制作方案)

2023-12-25每日一题 一、题目编号 1276. 不浪费原料的汉堡制作方案二、题目链接 点击跳转到题目位置 三、题目描述 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数 tomatoSlices …

全志R128 DSP开发工具安装教程

资料准备 要编译和仿真DSP&#xff0c;需要以下资料&#xff1a; DSP 核 SDK&#xff0c;SDK 需要包含DSP 编译源码。Cadence Xtensa 的 Windows IDE 工具 (Xplorer‑8.0.13 版本)&#xff0c; Windows 版本 DSP 的 package 包。Cadence Xtensa 的 License&#xff0c;用于服…

数据通信网络基础的网络参考模型华为ICT网络赛道

网络参考模型 目录 网络参考模型 2.1.应用与数据 2.2.网络参考模型与标准协议 2.2.1.OSI参考模型 2.2.2.TCP/IP参考模型 2.2.3.应用层 2.2.4.传输层 2.2.5.TCP和UDP 2.2.6.网络层 2.2.7.数据链路层 2.2.8.物理层 2.3.数据通信过程 2.1.应用与数据 应用的存在&#…

Flink学习-时间和窗口

在流数据处理应用中&#xff0c;一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”&#xff0c;一 般就是划定的一段时间范围&#xff0c;也就是“时间窗”&#xff1b;对在这范围内的数据进行处理&#xff0c;就是所谓的 窗口计算。所以窗口和时间往往是分不开的。 时…