`

未知长度链表中随机取出其中某一节点的值

 
阅读更多

转自:

 

题目描述:有一个单向链表的长度未知,怎样从中随机取出一个节点?要求每个节点被选中的概率相等。

解决方法:

   遍历一次链表,用一个临时变量pTemp指向返回的节点,设一个计数器iCount统计已遍历的节点个数,然后生成0到iCount-1之间的随机数;若生成的随机数为0,则将pTemp指针替换为当然节点的地址。可以证明对每一个节点,它被选中的概率为1/n,n为链表的长度。

    对于第i个节点,被选中的概率为:p = 1/i *(i  /i+1)*(i+1  /  i+2)*......(n-1  / n) = 1/n

代码如下:

 

[cpp] view plaincopy
 
  1. #include<iostream>  
  2. #include<cstring>  
  3. #include<cmath>  
  4. using namespace std;  
  5.   
  6. struct Node  
  7. {  
  8.     int iVal;  
  9.     Node* next;  
  10. };  
  11.   
  12. Node* GetOneNode(Node* head)  
  13. {  
  14.     if(head == NULL)  
  15.         return NULL;  
  16.     int iCount = 1;  
  17.     Node* tmp = head->next;  
  18.     Node* pRet = tmp;  
  19.     while(tmp)  
  20.     {  
  21.         int ran = rand();  
  22.         int t = ran%iCount;//生成0到iCount-1之间的一个随机数  
  23.         if(t == 0)  
  24.             pRet = tmp;  
  25.         iCount++;  
  26.         tmp = tmp->next;  
  27.     }  
  28.     return pRet;  
  29. }  
  30.   
  31. Node* initLinkList(Node* head, int N)  
  32. {  
  33.     Node* p = NULL;  
  34.     Node* pTemp = head;  
  35.     for(int i=0; i<N; i++)  
  36.     {  
  37.         p = new Node;  
  38.         p->iVal = rand();  
  39.         p->next = NULL;  
  40.         pTemp->next = p;  
  41.         pTemp = p;  
  42.     }  
  43.     return head;  
  44. }  
  45.   
  46. bool freeList(Node* head)  
  47. {  
  48.     Node* p = head;  
  49.     while(head)  
  50.     {  
  51.         p = head->next;  
  52.         delete head;  
  53.         head = p;  
  54.     }  
  55.     return true;  
  56. }  
  57.   
  58. int main()  
  59. {  
  60.     Node* head = new Node;  
  61.     head = initLinkList(head, 10);  
  62.     Node* pRet = GetOneNode(head);  
  63.     cout<<pRet->iVal<<endl;  
  64.     freeList(head);  
  65.     return 0;  
  66. }  
分享到:
评论

相关推荐

    初始化链表,插入删除节点,遍历链表,链表长度,找出中间节点

    数据结构 初始化链表,插入删除节点,遍历链表,链表长度,找出中间节点

    递归求链表中最大值、平均值、节点数

    在这个问题中,我们要用递归来处理单链表,并实现三个主要功能:找到链表中的最大值、计算链表的节点数量以及求所有整数的平均值。下面将详细讨论这些知识点。 首先,链表是一种基本的数据结构,由一系列节点组成,...

    查找链表中倒数第K个节点

    查找链表中倒数第K个节点,源代码验证通过,两种查找方法。

    数据结构 链表 查找倒数第N个节点的值 查找中间节点的值

    如果链表长度为偶数,则返回后一个节点的值(本例中未特别处理)。 #### 七、总结 本文档提供的代码展示了如何创建一个单向链表,并实现了基本的链表操作,如创建、遍历以及查找特定节点等功能。这些基础操作对于...

    python 删除链表中倒数第N个节点(csdn)————程序.pdf

    在Python中实现链表节点的删除,通常需要定义一个`ListNode`类,其构造函数接收一个值`val`和一个指向下一个节点的`next`指针。在实际编写代码时,必须注意各种边界条件,比如空链表、只有一个节点的链表、以及删除...

    链表实现随机森林 C++

    在C++中,我们可以使用结构体或类来定义链表节点,包含数据成员(如特征值)和指向下一个节点的指针。 对于随机森林的实现,我们首先需要创建一个决策树的类,这个类可以包含以下组件: 1. **节点类**:每个节点...

    数据结构c语言版链表删除重复节点

    链表作为一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在处理链表时,有时我们需要删除重复的节点以优化存储和提高查询效率。本文将详细介绍如何使用C语言实现链表删除重复...

    Java 单向链表 插入与删除节点

    这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。

    快速找到未知长度单链表的中间节点

    快速找到未知长度单链表的中间节点 普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为O(L+L/2)=O(3L/2)。

    链表

    其中`data`用于存储节点的实际数据,而`next`是一个指向链表中下一个节点的指针。 在`creatlist`函数中,我们创建了链表的头节点,并通过循环读取用户输入的字符来构建链表。每当读取到一个字符时,就创建一个新的...

    拷贝带随机指针的链表1

    首先,我们需要创建一个与原链表同样长度的新链表,其中每个新节点的值都等于原链表相应节点的值,但此时随机指针未设置。这可以通过遍历原链表并依次创建新节点来实现。 在创建新链表的过程中,我们先初始化新链表...

    一次遍历找链表倒数第n个节点

    在计算机科学中,链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。有时候我们需要找到链表中的特定节点,例如倒数第n个节点。本篇文章将详细介绍如何通过一次遍历来找到...

    用C写的链表的值查询

    链表是一种常用的数据结构,它在计算机科学中扮演着重要的角色。相较于数组,链表具有动态扩展、不连续存储等特性,使得它在处理插入、删除等操作时更具优势。本话题将深入探讨如何在C语言中实现链表的值查询。 ...

    C实现删除链表中指定结点

    链表是一种线性数据结构,其中的元素不是存储在连续的内存空间中,而是通过每个节点包含一个指向下一个节点的指针来连接起来。链表的操作包括插入、删除、查找等,而删除操作尤其需要注意指针的正确处理,以避免出现...

    双向链表通用管理程序(添加节点、删除节点等等)

    本程序就是为了解决这个问题,将双向链表的基本操作写成了一套通用程序,不管你的链表长什么样子,都可以使用它来帮你完成节点的插入、删除等操作,大幅度减轻编程工作量,让你可以将注意力集中到链表中其他的数据...

    单链表节点分拆形成两个新链表

    这里假设我们将根据节点数据是否大于某个特定阈值来进行分拆,大于阈值的节点放入一个新链表,不大于阈值的节点放入另一个新链表。 ```java public void splitList(int threshold, IntSLList list1, IntSLList list...

    c语言编程题之链表操作删除链表中的节点.zip

    在C语言中,链表是一种非常重要的数据结构,它由一系列节点组成,每个节点包含数据以及指向下一个节点的指针。本主题聚焦于如何在C语言中操作链表,特别是删除链表中的节点。以下是对这个编程题目的详细解读。 首先...

    拷贝具有随机指针节点的链表,

    在本问题中,我们关注的是一个特殊的链表,其中包含了一个额外的随机指针(random pointer),这个指针可以指向链表中的任意节点,而不仅限于下一个节点。这个数据结构在某些算法问题和复杂数据模型中非常有用。 ...

    链表中倒数第k个节点1

    题目要求我们实现一个名为 `getKthFromEnd` 的函数,该函数接受两个参数:一个链表的头节点 `head` 和一个整数 `k`,返回链表中的倒数第 k 个节点。题目规定链表的倒数第 1 个节点是尾节点。 一种解决方法是遍历...

    两个链表的第一个公共节点21

    在链表中,每个节点都包含一个值和一个指向下一个节点的指针。这种结构使得链表可以实现高效的插入、删除和查找等操作。例如,在链表中插入一个新的节点只需要将新的节点添加到链表的末尾,并将新的节点的指针设置为...

Global site tag (gtag.js) - Google Analytics