博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leet-go]-复杂链表的复制
阅读量:2055 次
发布时间:2019-04-28

本文共 1296 字,大约阅读时间需要 4 分钟。

文章目录

实现一个函数,完成复杂链表的复制功能;在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

题解分析

普通链表复制非常简单,只需遍历一遍,复制创建每个节点即可。但因此复杂链表中有一个next指针,指向不确定的节点,所以普通方式修改复制next指针时,需要在复制每个指针时遍历一遍链表;无法在O(N)时间内完成。

因链表是可以随意拼接、断开的;因此可以先把新创建的节点连接在源节点后面,在全部完成(包括设定next指针)后,再拆分为两个链表:原链表与新链表:

‘原节点 1 -> 新节点 1 -> 原节点 2 -> 新节点 2 -> ……’

  • 复制每一个节点,并拼接在原链表中;
  • 设定新节点的random指针:指向原节点random指针指向节点的下一个节点即可;
  • 拆分链表为原链表与新链表

复杂度分析:

  • 时间:只需遍历三遍链表即可,所以为O(N);
  • 空间:只需常数大小的额外空间,所以为O(1);

代码实现

节点定义:

type Node struct {
Val int Next *Node Random *Node}

复制链表:

func copyRandomList(head *Node) *Node {
if head == nil {
return nil } // copy each node for ori := head; ori != nil; {
cp := &Node{
Val: ori.Val, Next: ori.Next, Random: nil, } ori.Next = cp ori = cp.Next } // set the random-pointer for ori := head; ori != nil; {
if ori.Random != nil {
ori.Next.Random = ori.Random.Next } ori = ori.Next.Next } // construct the copy-list pre := head.Next result := pre head.Next = pre.Next for ori := pre.Next; ori != nil; {
pre.Next = ori.Next pre = pre.Next ori.Next = pre.Next ori = ori.Next } pre.Next = nil return result}

转载地址:http://wzilf.baihongyu.com/

你可能感兴趣的文章
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
逆序对的数量(递归+归并思想)
查看>>
数的范围(二分查找上下界)
查看>>
算法导论阅读顺序
查看>>
Windows程序设计:直线绘制
查看>>
linux之CentOS下文件解压方式
查看>>
Django字段的创建并连接MYSQL
查看>>
div标签布局的使用
查看>>
HTML中表格的使用
查看>>
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>
(PAT 1154) Vertex Coloring (图的广度优先遍历)
查看>>
(PAT 1115) Counting Nodes in a BST (二叉查找树-统计指定层元素个数)
查看>>
(PAT 1143) Lowest Common Ancestor (二叉查找树的LCA)
查看>>
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>