Write a function to reverse a linked list
Write a function to reverse a linked list  								  									    				  					
  
  
--
  
  
Iterative Method
  Iterate trough the linked list. In loop, change next to prev,  prev to current and current to next.
  
Implementation of Iterative Method
#include<stdio.h>#include<stdlib.h>/* 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);         getchar();} | 
Time Complexity:  O(n)
  Space Complexity: O(1)
Recursive Method:
1) Divide the list in two parts - first node and rest of the linked list. 2) Call reverse for the rest of the linked list. 3) Link rest to first. 4) Fix head pointer
void recursiveReverse(struct node** head_ref){    struct node* first;    struct node* rest;          /* empty list */    if (*head_ref == NULL)       return;       /* suppose first = {1, 2, 3}, rest = {2, 3} */    first = *head_ref;      rest  = first->next;    /* List has only one node */    if (rest == NULL)       return;       /* reverse the rest list and put the first element at the end */    recursiveReverse(&rest);    first->next->next  = first;           /* tricky step -- see the diagram */    first->next  = NULL;              /* fix the head pointer */    *head_ref = rest;              } | 
Time Complexity:  O(n)
  Space Complexity: O(1)
--
I am very grateful for this enlightening article. I am new to this issue, but for me it elucidated several questions. Congratulations on your knowledge on the subject. Thank you very much.
ReplyDeleteBeyond Compare 4