Tuesday 27 June 2017

Reverse Single Link List


/*Data Node Structure*/
typedef struct node {
int value;

struct node *next; 
}mynode;

// Globals (not required, though). 
mynode *head, *tail;

// Function to add new nodes to the linked list 
void add(int value) {
mynode * tmp = Null;
temp = (mynode *) malloc(sizeof(struct node)); 

temp->next=(mynode *)0; 
temp->value=value;
     if(head==(mynode *)0) {
          head=temp; 

          tail=temp;
     }

    else {
      tail->next=temp; 

      tail=temp;
    } 

}
// Function to print the linked list. 

void print_list() {
    printf("\n\n");
    for(temp=head; temp!=(mynode *)0; temp=temp->next) {
        printf("[%d]->",(temp->value)); 

    } 

}

/* Iterative Reverse*/
void iterative_reverse()
 {
       mynode *p, *q, *r;
       if(head == (mynode *)0) {
          return;
        }

      p = head;
      q = p->next; 

      p->next = (mynode *)0;

      while (q != (mynode *)0) {
      r = q->next;
     q->next = p; 

     p = q;
     q= r;
   } 

     head = p;
}

 // Reverse the linked list recursively 
It consume more stack memory.



int main()
{
// Reverse it.
 if(head != (mynode *)0)
   { 
      temp = reverse_recurse(head); 
      temp->next = (mynode *)0;
    }  
}
mynode* reverse_recurse(mynode *root) { 
   if(root->next!=(mynode *)0)
     { 
         reverse_recurse(root->next); 
         root->next->next=root;
         return(root); 
      } 
     else { 
        head=root; 
       }
  }

 

No comments:

Post a Comment