Why do we use double-pointer here? In the line void push(Node** head_ref, int new_data).
/* Given a reference (pointer to pointer) 
 to the head of a list and an int, 
 inserts a new node on the front of the list. */
 
void push(Node** head_ref, int new_data) 
{ 
/* 1. allocate node */
Node* new_node = new Node(); 
/* 2. put in the data */
new_node->data = new_data; 
/* 3. Make next of new node as head */
new_node->next = (*head_ref); 
/* 4. move the head to point to the new node */
(*head_ref) = new_node; 
}