https://leetcode.cn/problems/linked-list-random-node/
这道题我们首先看到题目中的要求:在单链表中随机选取一个链表中的结点,要使每个结点被选取的概率是一样的。
当我们看到随机这两个字时,应该就会想起rand()这个函数。接着我们把使用这个函数生成的随机值与链表的长度进行模运算,这样子求出的结果就不会大于链表长度。
//用数组存储该链表
typedef struct {
int* arr;
int length;
} Solution;
Solution* solutionCreate(struct ListNode* head) {
Solution* obj = (Solution*)malloc(sizeof(Solution));
obj->length = 0;
struct ListNode* Node = head;
//记录链表长度
while(Node)
{
++obj->length;
Node = Node->next;
}
obj->arr = (int*)malloc(sizeof(int) * obj->length);
Node = head;
//将链表节点中的值赋值给数组
for(int i =0; i<obj->length;i++)
{
obj->arr[i] = Node->val;
Node = Node->next;
}
return obj;
}
int solutionGetRandom(Solution* obj) {
//rand生成的随机值 % 链表长度 的值不会大于链表长度
return obj->arr[rand() % obj->length];
}
void solutionFree(Solution* obj) {
free(obj->arr);
free(obj);
}