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

2024-01-02 06:28

本文主要是介绍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--}}

这篇关于Golang leetcode707 设计链表 (链表大成)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561584

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry