本文最后更新于224 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com
1.题目基本信息
1.1.题目描述
给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。
实现 Solution 类:
-
Solution(ListNode head) 使用整数数组初始化对象。
-
int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。
1.2.题目地址
https://leetcode.cn/problems/linked-list-random-node/description/
2.解题方法
2.1.解题思路
池塘随机抽样
2.2.解题步骤
第一步,初始化池塘空间(这里的池塘空间大小为1)
第二步,遍历数据流
- 2.1.随机地将当前元素添加到池塘空间中
第三步,最终池塘空间中的每个元素的出现概率都是均匀的
3.解题代码
python代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
# 思路:池塘随机抽样
def __init__(self, head: Optional[ListNode]):
self.head = head
def getRandom(self) -> int:
i = 1
node = self.head
# 第一步,初始化池塘空间(这里的池塘空间大小为1)
ans = node.val
# 第二步,遍历数据流
while node is not None:
# 2.1.随机地将当前元素添加到池塘空间中
if random.randrange(i) == 0:
ans = node.val
i += 1
node = node.next
# 第三步,最终池塘空间中的每个元素的出现概率都是均匀的
return ans
c++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
ListNode* head;
public:
Solution(ListNode* head) {
this->head = head;
}
int getRandom() {
ListNode* cur = this->head;
int ans = cur->val;
int i = 1;
while (cur) {
if (rand() % i == 0) {
ans = cur->val;
}
cur = cur->next;
i++;
}
return ans;
}
};
4.执行结果










