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

idea:
uniformly random choose a node from linkedlist

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {

    /** @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) {
        
    }
    
    /** Returns a random node's value. */
    public int getRandom() {
        
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(head);
 * int param_1 = obj.getRandom();
 */

get the whole length of the linkedlist, and random picked one index and move head pointer to there.
we need to proprecess to the length.

class Solution {

    /** @param head The linked list's head.
        Note that the head is guaranteed to be not null, so it contains at least one node. */
    ListNode head;
    int len;
    Random rand;
    public Solution(ListNode head) {
        this.head = head;
        rand = new Random();
        ListNode p = head;
        len = 1;
        while (p.next != null) {
            p = p.next;
            len++;
        }
    }
    
    /** Returns a random node's value. */
    public int getRandom() {
        int index = rand.nextInt(len);
        ListNode p = head;
        while (index > 0) {
            index--;
            p = p.next; 
        }
        return p.val;
    }
}