📌  相关文章
📜  从单链表中选择随机节点的 C 程序(1)

📅  最后修改于: 2023-12-03 15:36:16.697000             🧑  作者: Mango

从单链表中选择随机节点的 C 程序

在单链表中,每个节点都只有一个指针指向下一个节点。从单链表中选择随机节点需要对所有节点进行遍历,然后随机选择一个节点。这个过程需要遍历整个链表,时间复杂度为 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

参考文献:

  • 《数据结构与算法分析》(C 语言描述),第五版, Mark Allen Weiss 著,袁春雷、唐红云 译,电子工业出版社,2020。