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);
}