📅  最后修改于: 2023-12-03 15:36:16.697000             🧑  作者: Mango
在单链表中,每个节点都只有一个指针指向下一个节点。从单链表中选择随机节点需要对所有节点进行遍历,然后随机选择一个节点。这个过程需要遍历整个链表,时间复杂度为 O(n)。
下面是一个随机选择节点的 C 程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct ListNode {
int val;
struct ListNode *next;
};
// 遍历链表并返回链表长度
int getListLength(struct ListNode* head) {
int count = 0;
while (head != NULL) {
count++;
head = head->next;
}
return count;
}
// 随机选择节点
int getRandomNode(struct ListNode* head) {
// 获取链表长度
int len = getListLength(head);
// 生成随机数
srand(time(NULL));
int index = rand() % len;
// 跳至随机节点
for (int i = 0; i < index; i++) {
head = head->next;
}
// 返回节点值
return head->val;
}
上面的代码中, getListLength
函数用来遍历链表并返回链表长度。 getRandomNode
函数是随机选择节点的主函数。
在 getRandomNode
函数中,首先通过 getListLength
函数获取链表长度。然后用 srand
函数生成随机数种子,再用 rand
函数生成一个随机数。根据随机数跳至随机节点,并返回节点值即可。
代码中使用了 time
头文件,因此需要链接 librt
库。
LDFLAGS += -lrt
参考文献: