382. Linked List Random Node

来源:互联网 发布:淘宝上的游侠9账号 编辑:程序博客网 时间:2024/05/12 23:49

Given a singly linked list, return a random node's value from the linked list. Each node must have thesame probability of being chosen.

Follow up:
What if the linked list is extremely large and its length is unknown to you? Could you solve this efficiently without using extra space?

Example:

// Init a singly linked list [1,2,3].ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);Solution solution = new Solution(head);// getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.solution.getRandom();
等概率随机返回列表数据

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    private ListNode list;    private int len;    /** @param head The linked list's head.        Note that the head is guaranteed to be not null, so it contains at least one node. */    public Solution(ListNode head) {        list = head;len = 0;ListNode p = head;while (p != null) {p = p.next;len++;}    }        /** Returns a random node's value. */    public int getRandom() {        ListNode p = list;int random = (int) (Math.random() * len);while (p != null && random > 0) {p = p.next;random--;}return p == null ? 0 : p.val;    }}



0 0