[算法]剑指offer p26复杂链表的复制 golang
2022/3/3 14:46:56
本文主要是介绍[算法]剑指offer p26复杂链表的复制 golang,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
[算法]剑指offer p26复杂链表的复制 golang
题目
题目:请实现函数Clone,复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sub指向链表中的任意结点或者NULL。结点的 golang 定义如下: type ComplexLinkNode struct { Value int Next *ComplexLinkNode Sub *ComplexLinkNode } //复杂链表的复制 func (h *ComplexLinkNode) Clone() (newHead *ComplexLinkNode) { //todo return }
如上图所示, 黑色箭头是 next 指针, 绿色箭头是 sub 指针
例如节点1的 next 指向节点2, 节点4 的 next 指向自身
解法1
思路:
先使用 next ,复制一条新链表, 使用 map 构建旧链表到新链表的映射, 再连接 sub 的节点
时间复杂度是 O(n)
如果第一次复制 next 节点, 新的链表的 sub 指针还是指向的旧链表, 所以是不行的, 第二次复制 sub 节点就需要通过 value 遍历新链表(时间复杂度是 O(n2)), 而且 value 重复还会导致复制错误.
代码
// 记录当前路径总和 type ComplexLinkNode struct { Value int Next *ComplexLinkNode Sub *ComplexLinkNode } //复杂链表的复制 //复杂链表不得是环形链表,将会死循环 todo: 死循环处理 func (h *ComplexLinkNode) Clone() (newHead *ComplexLinkNode) { //参数处理 if h == nil { fmt.Printf("%s\n", "err: h==nil") return nil } //复制 next 指针,并使用 hashmap 映射 hashMap := make(map[*ComplexLinkNode]*ComplexLinkNode) newHead = &ComplexLinkNode{Value: h.Value, Next: h.Next, Sub: h.Sub} hashMap[h] = newHead tempNode := newHead for { //退出条件 if tempNode.Next == nil { break } //复制链表 oldNode := tempNode.Next tempNode.Next = &ComplexLinkNode{Value: tempNode.Next.Value, Next: tempNode.Next.Next, Sub: tempNode.Next.Sub} //hash 映射 hashMap[oldNode] = tempNode.Next //下一个节点 tempNode = tempNode.Next } //2. 使用 hashmap 复制 sub 指针 tempNode = newHead tempNode.Sub = hashMap[tempNode.Sub] for { //退出条件 if tempNode.Next == nil { break } //sub 指针 tempNode.Next.Sub = hashMap[tempNode.Next.Sub] //下一个节点 tempNode = tempNode.Next } return }
测试
package main import ( "fmt" "testing" "github.com/stretchr/testify/assert" ) func TestP26(t *testing.T) { n1 := &ComplexLinkNode{Value: 1, Next: nil, Sub: nil} n2 := &ComplexLinkNode{Value: 1, Next: nil, Sub: nil} n3 := &ComplexLinkNode{Value: 1, Next: nil, Sub: nil} n4 := &ComplexLinkNode{Value: 1, Next: nil, Sub: nil} n1.Next = n2 n2.Next = n3 n3.Next = n4 n1.Sub = n3 n2.Sub = n4 n3.Sub = n1 n4.Sub = n1 cln := n1.Clone() assert.Equal(t, n1, cln) }
这篇关于[算法]剑指offer p26复杂链表的复制 golang的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享