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

news2024/11/25 23:45:31

文章目录

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

设计链表 Leetcode707

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

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

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

不使用头节点

// ListNode 定义链表结构
type ListNode struct {
	Val  int
	Next *ListNode
}

//正常建立,不涉及头节点
// MyLinkedList 为了方便操作链表建立的结构体
type MyLinkedList struct {
	size int
	Head *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.Head

	for ; 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 = Node
	this.size++
}

// AddAtTail 将数据为val的节点添加到最后一位 √
func (this *MyLinkedList) AddAtTail(val int) {
	this.size++
	if this.Head == nil {
		this.Head = &ListNode{Val: val}
		return
	}
	Node := this.Head
	for 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,则需要改动首结点,直接待用addAtHead
	if index == 0 {
		this.AddAtHead(val)
		return
	}

	cur := this.Head
	Node := cur

	//0 1 2 3	;index=2
	for ; index > 1; index-- {
		Node = Node.Next
	}
	Node.Next = &ListNode{Val: val, Next: Node.Next}
	this.Head = cur
	this.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.Next
		this.size--
		return
	}

	Node := this.Head
	cur := Node

	0 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 = nil
		this.size--
		return
	}
	cur.Next = cur.Next.Next
	this.Head = Node
	this.size--
}


使用头节点 推荐**

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

//本次目标时建立具有 头节点 的链表(虚拟头节点,但实际就是有头节点)
//链表结构:H* 0 1 2 3
//优势,在对头节点后的节点进行操作会方便

type MyLinkedList struct {
	Size      int
	DummyHead *ListNode
}

// Constructor 使用虚拟头节点时,很关键的一步在在初始化我们的mylinkedlist,我们需要直接对dummyhead分配内存空间,防止后续对首个节点进行操作时出现问题
func Constructor() MyLinkedList {
	return MyLinkedList{DummyHead: &ListNode{}}
}

func (this *MyLinkedList) Get(index int) int {
	//*h 0 1 2 3	;0
	if this.Size <= index {
		return -1
	}

	DummyHead := this.DummyHead
	cur := DummyHead

	for ; 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.DummyHead
	cur := DummyHead
	//h* 0 1 2 3 4	;
	for cur.Next != nil {
		cur = cur.Next
	}
	cur.Next = &ListNode{Val: val}
	this.DummyHead = DummyHead
	this.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	;2
	if this.Size > index {
		DummyHead := this.DummyHead
		cur := DummyHead

		for ; index > 0; index-- {
			cur = cur.Next
		}
		cur.Next = &ListNode{Val: val, Next: cur.Next}
		this.DummyHead = DummyHead
		this.Size++
	}

}

func (this *MyLinkedList) DeleteAtIndex(index int) {
	//h* 0 1 2 3 4	;0

	if this.Size > index {
		DummyHead := this.DummyHead
		cur := DummyHead

		for ; index > 0; index-- {
			cur = cur.Next
		}
		cur.Next = cur.Next.Next
		this.DummyHead = DummyHead
		this.Size--
	}

}

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

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

相关文章

8个Python高效数据分析的技巧,不看肯定后悔~

本文介绍的数据分析方法&#xff0c;不仅能够提升运行效率&#xff0c;还能够使代码更加“优美”。 不管是参加Kaggle比赛&#xff0c;还是开发一个深度学习应用&#xff0c;第一步总是数据分析&#xff0c;这篇文章介绍了8个使用Python进行数据分析的方法&#xff0c;不仅能够…

实现CodeWave 低代码开发平台快速应用开发的完整指南

目录 前言1 CodeWave开发流程2 应用创建2.1 新建应用2.2 从应用模板创建应用 3 数据模型设计3.1 实体设计3.2 结构设计3.3 枚举设计 4 逻辑设计4.1 查询数据源设置4.2 组件和属性配置4.3 属性设置与服务端全局变量 5 页面设计5.1 选择页面模板5.2 前端全局变量设计5.3 事件逻辑…

音视频技术开发周刊 | 326

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 全球最强「开源版Gemini」诞生&#xff01;全能多模态模型Emu2登热榜&#xff0c;多项任务刷新SOTA 最强的全能多模态模型来了&#xff01;就在近日&#xff0c;智源研究院…

红队打靶练习:SAR: 1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 小结 目录探测 1、gobuster 2、dirsearch WEB CMS 1、cms漏洞探索 2、RCE漏洞利用 提权 get user.txt 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface:…

系统学习Python——装饰器:函数装饰器-[对方法进行装饰:使用嵌套函数装饰方法]

分类目录&#xff1a;《系统学习Python》总目录 如果想要函数装饰器在简单函数和类级别的方法上都能工作&#xff0c;最直接的解决办法在于使用前面文章介绍的状态保持方案之一&#xff1a;把自己的函数装饰器编写为嵌套的def&#xff0c;这样你就不会陷入单一的self实例参数既…

【办公技巧】pdf打印没反应怎么办

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

找火鸡^^

欢迎来到程序小院 找火鸡 玩法&#xff1a;记忆翻牌游戏&#xff0c;不同关卡会有不同数目的火鸡&#xff0c;卡牌自由滚动&#xff0c;记住火鸡的位置&#xff0c; 规定的时间内找到火鸡所在的位置&#xff0c;快去找火鸡吧^^。开始游戏https://www.ormcc.com/play/gameStart…

江西速欣商务咨询有限公司:债务规划重组的专业法务咨询服务

在财务管理中&#xff0c;债务问题往往成为个人和企业面临的一项重要挑战。江西速欣商务咨询有限公司作为债务问题的专业解决者&#xff0c;致力于为客户提供高效而专业的债务规划重组法务咨询服务&#xff0c;帮助他们摆脱负担&#xff0c;重整财务秩序。 深谙债务规划的专业智…

Python 基础语法01

变量声明 #运算 num 1 num 1 print("num 1",num)num - 1 print("num - 1", num)num * 4 print("num * 4",num)num 3 num % 2 print("num%2",num)num ** 2 print("num ** 2", num)num 9 num // 2 print("num // …

JavaScript 中常用事件

前言: 介绍了什么是事件以及原理&#xff0c;还有常用的事件及使用 **如果演示结果不好理解&#xff0c;可以复制代码到自己的电脑中运行&#xff0c;这样你们可以更好理解也可以研究出好玩的&#xff0c;研究出的话顺便发给我也玩玩&#x1f92d; 文章目录 什么是事件原理鼠标…

针对工行的LockBit勒索软件攻击表明了全球金融系统对网络攻击的脆弱性

内容概要&#xff1a; 11月8日&#xff0c;工行一家美国子公司被勒索软件入侵导致美国国债交易业务瘫痪&#xff0c;暴露了全球金融系统易受网络攻击的脆弱性。LockBit勒索软件集团声称对工行的攻击负责。工行是世界上资产规模最大的银行&#xff0c;管理着5.7万亿美元。这一网…

轻松提升软件性能:快速学习和使用Memcached

目录 1、前言 2、Memcached的简介 3、Memcached的安装与配置 4、Memcached的数据结构 5、Memcached的常用命令 6、Memcached的高级特性 7、Memcached在系统中如何使用 8、结语 1、前言 Memcached是一个广泛用于提升软件性能的开源内存缓存系统。它可以有效地减少对数据…

代码随想Day55 | 392.判断子序列、115.不同的子序列

392.判断子序列 第一种思路是双指针&#xff0c;详细代码如下&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {//双指针if(s.empty()&&t.empty()) return true;int i0,j0;while(i<t.size()){if(s[j]t[i]) j;if(js.size()) return t…

MySQL触发器的创建、查看、删除、存储过程与触发器的区别等

MySQL触发器 1、什么是触发器2、创建触发器3、查看所有的触发器4、删除触发器5、常见的触发器案例6、存储过程与触发器的区别 1、什么是触发器 简单点来说触发器就是一个特殊的存储过程&#xff0c;不过存储过程需要手动调用&#xff0c;而触发器自动调用。 一张图来简单说明…

GPT编程(1)八分类图像数据集转换为二分类

一个核心问题就是要将这八类数据图片全部重命名&#xff0c;尝试了一步到位 有一个图像数据集&#xff0c;有八个类别amusement,anger,awe,contentment,disgust, excitement, fear,sadness的图片&#xff0c;每张图片被命名为“类别数字”。采用遍历的方式&#xff0c;按顺序阅…

架构设计的核心:从多个维度理论分析

文章目录 一、如何实现高内聚低耦合的架构1、确定边界2、内聚的分类3、耦合的分类4、如何实现高内聚低耦合&#xff08;1&#xff09;耦合关注点&#xff08;2&#xff09;低耦合原则&#xff08;3&#xff09;高内聚原则 二、如何实现可扩展性的架构1、扩展性&#xff1a;核心…

OpenHarmony之系统调用

背景 对于运行L0系统的硬件一般是mcu&#xff0c;资源有限&#xff0c;L0系统没有区分内核态和用户态&#xff0c;所有的代码都在内核态运行&#xff0c;所以不需要系统调用 L2系统用的是Linux内核&#xff0c;所以系统调用跟Linux Kernel的是一样的。 所以我们主要来看看L1系…

构建基础wlan网络 hcia无线

实验 旁挂组网 二层网络 ac为 dhcp的服务器给ap地址 s1给sta的ip地址 DHCP 业务为直接转发 实验步骤 第一步 poe 开启 poe en 开启 第二步 有线连接 vlan的配置 s1 vlan batch 100 101 连接的端口 port link-type trunk port trunk allow-pass …

阶段十-分布式-nginx服务器

一、Nginx简介 Nginx 是高性能的 HTTP 和反向代理的服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。tomcat并发数量理论值是500&#xff0c;实际也就300左右。 1.2 正向代理 正向代理代理的是客户…

文心一言 VS 讯飞星火 VS chatgpt (170)-- 算法导论13.2 3题

三、用go语言&#xff0c;设在图 13-2 左边一棵树中&#xff0c;a、b和c 分别为子树a、β和γ中的任意结点。当结点 x 左旋之后&#xff0c;a、b和c 的深度会如何变化&#xff1f; 文心一言&#xff1a; 在二叉树中&#xff0c;左旋操作是改变节点的子节点顺序。原本的子节点…