《零基础Go语言算法实战》【题目 4-6】随机选择单链表的一个节点并返回

《零基础Go语言算法实战》

【题目 4-6】随机选择单链表的一个节点并返回

给定一个单链表,请随机选择链表的一个节点,并返回相应的节点值。保证每个节点被

选择的概率相同。

【解答】

① 思路。

通过 rand.Float64() 函数可以返回 [0,1) 范围内的随机数,利用这个函数完成随机化选择

节点的过程。

② Go 语言实现。

package main

import (

"fmt"

"math/rand"

)

// 定义单链表

type ListNode struct {

Data int

Next *ListNode

}

type Head struct {

head *ListNode

}

// 初始化链表

func NewListNode(head *ListNode) Head {

return Head{head: head}

}

// 返回随机节点的值

func (h *Head) GetRandom() int {

scope, selectPoint, curr := 1, 0, h.head

for curr != nil {

if rand.Float64() < 1.0/float64(scope) {

selectPoint = curr.Data

}

scope += 1

curr = curr.Next

}

return selectPoint

}

func main() {

nodeList := ListNode{6, nil}

head := NewListNode(&nodeList)

obj := NewListNode(head.head)

ret := obj.GetRandom()

fmt.Println(ret)

}

相关推荐
To_OC2 分钟前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
爻渡13 分钟前
异步编程演进史:从回调到Promise再到Async/Await
后端·程序员
AskHarries4 小时前
网页自动化助手:从需求到 Browser 执行链路
程序员
To_OC17 小时前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
Coffeeee1 天前
两个例子,帮你快速理解什么是Token
人工智能·程序员·ai编程
文心快码BaiduComate1 天前
从个人提效到组织提效:Comate辅助构建自我进化的AI研发系统
前端·程序员
微信公众号AI创造财富1 天前
VSC++ xc0150002 是 Visual C++ 运行库缺失导致的?
程序员
AskHarries1 天前
企业微信 / Telegram / WhatsApp 接入
程序员
05Kevin1 天前
lk每日冒险题--数据结构6.27
算法