• 2021-04-09:rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点 head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点。 【要求】时间复杂度O(N),额外空间复杂度O(1) 。


    2021-04-09:rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点 head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点。 【要求】时间复杂度O(N),额外空间复杂度O(1) 。

    福大大 答案2021-04-09:

    假设链表节点是A1→B1→C1。
    1.复制节点,插入原链表,链表变成A1→A2→B1→B2→C1→C2。
    2.设置A2、B2、C2的随机指针。
    3.拆分链表。变成A1→B1→C1和A2→B2→C2。
    4.返回A2→B2→C2。

    代码用golang编写。代码如下:

    package main
    
    import "fmt"
    
    func main() {
        head := &Node{Val: 1}
        head.Next = &Node{Val: 2}
        head.Next.Next = &Node{Val: 3}
        head.Next.Next.Random = head
        fmt.Print("原结构:")
        printlnLinkNodeList(head)
        ret := copyRandomList(head)
        fmt.Print("复制结构:")
        printlnLinkNodeList(ret)
    }
    
    // Definition for a Node.
    type Node struct {
        Val    int
        Next   *Node
        Random *Node
    }
    
    func copyRandomList(head *Node) *Node {
        //复制节点
        cur := head
        var curCopy *Node
        for cur != nil {
            curCopy = &Node{Val: cur.Val}
            curCopy.Next = cur.Next
            cur.Next = curCopy
            cur = curCopy.Next
        }
        //设置随机节点
        cur = head
        for cur != nil && cur.Next != nil {
            if cur.Random != nil {
                cur.Next.Random = cur.Random.Next
            }
            cur = cur.Next.Next
        }
    
        //分离成两个链表
        cur = head
        headCopy := head.Next
        for cur != nil && cur.Next != nil {
            next := cur.Next
            cur.Next = cur.Next.Next
            cur = next
        }
    
        //返回复制链表
        return headCopy
    }
    
    //链表打印
    func printlnLinkNodeList(head *Node) {
        cur := head
        for cur != nil {
            if cur.Random != nil {
                fmt.Print(cur.Val, "_", cur.Random.Val, " ")
            } else {
                fmt.Print(cur.Val, "_nil ")
            }
            cur = cur.Next
        }
        fmt.Println()
    }
    
    

    执行结果如下:
    在这里插入图片描述


    左神java代码
    力扣138. 复制带随机指针的链表
    评论

  • 相关阅读:
    geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)
    我的2016,感恩、乐观、努力
    我的奋斗——从印刷工人到地理信息大数据系统程序员
    geotrellis使用(二十七)栅格数据色彩渲染
    用户画像
    栈和队列在python中的实现
    跳一跳第一天总结
    在pycharm中使用scrapy爬虫
    用户使用手册
    项目测试报告和用户使用手册
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14638942.html
Copyright © 2020-2023  润新知