转自:
题目描述:有一个单向链表的长度未知,怎样从中随机取出一个节点?要求每个节点被选中的概率相等。
解决方法:
遍历一次链表,用一个临时变量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
代码如下:
- #include<iostream>
- #include<cstring>
- #include<cmath>
- using namespace std;
- struct Node
- {
- int iVal;
- Node* next;
- };
- Node* GetOneNode(Node* head)
- {
- if(head == NULL)
- return NULL;
- int iCount = 1;
- Node* tmp = head->next;
- Node* pRet = tmp;
- while(tmp)
- {
- int ran = rand();
- int t = ran%iCount;//生成0到iCount-1之间的一个随机数
- if(t == 0)
- pRet = tmp;
- iCount++;
- tmp = tmp->next;
- }
- return pRet;
- }
- Node* initLinkList(Node* head, int N)
- {
- Node* p = NULL;
- Node* pTemp = head;
- for(int i=0; i<N; i++)
- {
- p = new Node;
- p->iVal = rand();
- p->next = NULL;
- pTemp->next = p;
- pTemp = p;
- }
- return head;
- }
- bool freeList(Node* head)
- {
- Node* p = head;
- while(head)
- {
- p = head->next;
- delete head;
- head = p;
- }
- return true;
- }
- int main()
- {
- Node* head = new Node;
- head = initLinkList(head, 10);
- Node* pRet = GetOneNode(head);
- cout<<pRet->iVal<<endl;
- freeList(head);
- return 0;
- }
相关推荐
数据结构 初始化链表,插入删除节点,遍历链表,链表长度,找出中间节点
在这个问题中,我们要用递归来处理单链表,并实现三个主要功能:找到链表中的最大值、计算链表的节点数量以及求所有整数的平均值。下面将详细讨论这些知识点。 首先,链表是一种基本的数据结构,由一系列节点组成,...
查找链表中倒数第K个节点,源代码验证通过,两种查找方法。
如果链表长度为偶数,则返回后一个节点的值(本例中未特别处理)。 #### 七、总结 本文档提供的代码展示了如何创建一个单向链表,并实现了基本的链表操作,如创建、遍历以及查找特定节点等功能。这些基础操作对于...
在Python中实现链表节点的删除,通常需要定义一个`ListNode`类,其构造函数接收一个值`val`和一个指向下一个节点的`next`指针。在实际编写代码时,必须注意各种边界条件,比如空链表、只有一个节点的链表、以及删除...
在C++中,我们可以使用结构体或类来定义链表节点,包含数据成员(如特征值)和指向下一个节点的指针。 对于随机森林的实现,我们首先需要创建一个决策树的类,这个类可以包含以下组件: 1. **节点类**:每个节点...
链表作为一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在处理链表时,有时我们需要删除重复的节点以优化存储和提高查询效率。本文将详细介绍如何使用C语言实现链表删除重复...
这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。
快速找到未知长度单链表的中间节点 普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为O(L+L/2)=O(3L/2)。
其中`data`用于存储节点的实际数据,而`next`是一个指向链表中下一个节点的指针。 在`creatlist`函数中,我们创建了链表的头节点,并通过循环读取用户输入的字符来构建链表。每当读取到一个字符时,就创建一个新的...
首先,我们需要创建一个与原链表同样长度的新链表,其中每个新节点的值都等于原链表相应节点的值,但此时随机指针未设置。这可以通过遍历原链表并依次创建新节点来实现。 在创建新链表的过程中,我们先初始化新链表...
在计算机科学中,链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。有时候我们需要找到链表中的特定节点,例如倒数第n个节点。本篇文章将详细介绍如何通过一次遍历来找到...
链表是一种常用的数据结构,它在计算机科学中扮演着重要的角色。相较于数组,链表具有动态扩展、不连续存储等特性,使得它在处理插入、删除等操作时更具优势。本话题将深入探讨如何在C语言中实现链表的值查询。 ...
链表是一种线性数据结构,其中的元素不是存储在连续的内存空间中,而是通过每个节点包含一个指向下一个节点的指针来连接起来。链表的操作包括插入、删除、查找等,而删除操作尤其需要注意指针的正确处理,以避免出现...
本程序就是为了解决这个问题,将双向链表的基本操作写成了一套通用程序,不管你的链表长什么样子,都可以使用它来帮你完成节点的插入、删除等操作,大幅度减轻编程工作量,让你可以将注意力集中到链表中其他的数据...
这里假设我们将根据节点数据是否大于某个特定阈值来进行分拆,大于阈值的节点放入一个新链表,不大于阈值的节点放入另一个新链表。 ```java public void splitList(int threshold, IntSLList list1, IntSLList list...
在C语言中,链表是一种非常重要的数据结构,它由一系列节点组成,每个节点包含数据以及指向下一个节点的指针。本主题聚焦于如何在C语言中操作链表,特别是删除链表中的节点。以下是对这个编程题目的详细解读。 首先...
在本问题中,我们关注的是一个特殊的链表,其中包含了一个额外的随机指针(random pointer),这个指针可以指向链表中的任意节点,而不仅限于下一个节点。这个数据结构在某些算法问题和复杂数据模型中非常有用。 ...
题目要求我们实现一个名为 `getKthFromEnd` 的函数,该函数接受两个参数:一个链表的头节点 `head` 和一个整数 `k`,返回链表中的倒数第 k 个节点。题目规定链表的倒数第 1 个节点是尾节点。 一种解决方法是遍历...
在链表中,每个节点都包含一个值和一个指向下一个节点的指针。这种结构使得链表可以实现高效的插入、删除和查找等操作。例如,在链表中插入一个新的节点只需要将新的节点添加到链表的末尾,并将新的节点的指针设置为...