Solution 1: Recursive Approach - We can recursively traverse the linked list till we arrive at the last but one node. We then set the next pointer of the last node to point to the current node. We keep reversing the links as we unwind the recursive calls.
Code:
// Takes a pointer to the head node of a singly linked list // and returns the new head pointer for the reversed list Node * Reverse(Node * head) { Node *newHead = Recursive_Reverse(head); head->next = NULL; // since the first node is the last node now // we need to set it's next pointer to NULL return newHead; } Node * Recursive_Reverse(Node * node) { Node *nextNode = node->next; if(nextNode == NULL) // if the list has only one node { // we don't need to reverse it return node; } if(nextNode->next == NULL) // if nextNode is the last node we terminate the recursion { nextNode->next = node; // reverse the link return nextNode; // return the ptr to the last node // this will become the new head pointer } Node *head = Reverse(node->next); //recursively call Reverse nextNode->next = node; // reverse the link return head; }
Solution 2: We can also reverse the singly linked list using an iterative approach. For some this approach can be easier to understand. Basically, we maintain 3 pointers (prevNode, currentNode, and nextNode). At each step we save the next of the currentNode in the nextNode ptr and reverse the link. After this, we advance the previous and current pointers.
Code:
//Takes a pointer to the head of a linked list //Returns the pointer to the new head (old tail) node Node * Iterative_Reverse(Node *head) { Node *prevNode = NULL; //pointer to the previous node Node *nextNode = NULL; //pointer to the next node Node *currentNode = head; //pointer to the current node while(currentNode) { nextNode = currentNode->next; //save the pointer to the next node //otherwise we will lose it as we // overwrite it in the next step currentNode->next = prevNode; //reverse the link prevNode = currentNode; //set the current node as the previous node //for the next iteration currentNode = nextNode; //advance the current pointer } return prevNode; }
you are not setting the last node to NULL in your recursive reverse function.
ReplyDelete