Skip to content
Related Articles
Data Structures | Linked List | Question 5
• Difficulty Level : Medium
• Last Updated : 01 Feb, 2013

The following function reverse() is supposed to reverse a singly linked list. There is one line missing at the end of the function.

 `/* Link list node */``struct` `node``{``    ``int` `data;``    ``struct` `node* next;``};`` ` `/* head_ref is a double pointer which points to head (or start) pointer ``  ``of linked list */``static` `void` `reverse(``struct` `node** head_ref)``{``    ``struct` `node* prev   = NULL;``    ``struct` `node* current = *head_ref;``    ``struct` `node* next;``    ``while` `(current != NULL)``    ``{``        ``next  = current->next;  ``        ``current->next = prev;   ``        ``prev = current;``        ``current = next;``    ``}``    ``/*ADD A STATEMENT HERE*/``}`` `

What should be added in place of “/*ADD A STATEMENT HERE*/”, so that the function correctly reverses a linked list.
(A) *head_ref = prev;
(B) *head_ref = current;
(C) *head_ref = next;
(D) *head_ref = NULL;

Answer: (A)

Explanation: *head_ref = prev;

At the end of while loop, the prev pointer points to the last node of original linked list. We need to change *head_ref so that the head pointer now starts pointing to the last node.

 `#include``#include``  ` `/* Link list node */``struct` `node``{``    ``int` `data;``    ``struct` `node* next;``};``  ` `/* Function to reverse the linked list */``static` `void` `reverse(``struct` `node** head_ref)``{``    ``struct` `node* prev   = NULL;``    ``struct` `node* current = *head_ref;``    ``struct` `node* next;``    ``while` `(current != NULL)``    ``{``        ``next  = current->next;  ``        ``current->next = prev;   ``        ``prev = current;``        ``current = next;``    ``}``    ``*head_ref = prev;``}``  ` `/* Function to push a node */``void` `push(``struct` `node** head_ref, ``int` `new_data)``{``    ``/* allocate node */``    ``struct` `node* new_node =``            ``(``struct` `node*) ``malloc``(``sizeof``(``struct` `node));``             ` `    ``/* put in the data  */``    ``new_node->data  = new_data;``                 ` `    ``/* link the old list off the new node */``    ``new_node->next = (*head_ref);    ``         ` `    ``/* move the head to point to the new node */``    ``(*head_ref)    = new_node;``}``  ` `/* Function to print linked list */``void` `printList(``struct` `node *head)``{``    ``struct` `node *temp = head;``    ``while``(temp != NULL)``    ``{``        ``printf``(``"%d  "``, temp->data);    ``        ``temp = temp->next;  ``    ``}``}    ``  ` `/* Drier program to test above function*/``int` `main()``{``    ``/* Start with the empty list */``    ``struct` `node* head = NULL;``    ` `     ``push(&head, 20);``     ``push(&head, 4);``     ``push(&head, 15); ``     ``push(&head, 85);      ``      ` `     ``printList(head);    ``     ``reverse(&head);                      ``     ``printf``(``"\n Reversed Linked list \n"``);``     ``printList(head);    ``     ``return` `0;``}`

My Personal Notes arrow_drop_up