Brief list of simple problems based on linked list and their solutions.
Most of them are recursive approaches and they can be written iteratively also.
1.Given a linked-list and 2 integers k & m. Reverse the linked-list till k elements and then traverse till m elements and repeat.
2.Reverse a Linked List(Recursion and Iterative methods).
3.Print Linked List in Reverse & Alternative nodes.
Most of them are recursive approaches and they can be written iteratively also.
1.Given a linked-list and 2 integers k & m. Reverse the linked-list till k elements and then traverse till m elements and repeat.
2.Reverse a Linked List(Recursion and Iterative methods).
3.Print Linked List in Reverse & Alternative nodes.
#include<iostream>
#include<sstream>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
struct node{
int data;
struct node *next;
};
void push(struct node **head_first,int data){
struct node *new_node=NULL;
new_node=(struct node*)malloc(sizeof(struct node));
new_node->data=data;
new_node->next=(*head_first);
*head_first=new_node;
}
void printAll(struct node *head){
while(head!=NULL){
cout<<head->data<<"\t";
head=head->next;
}
}
void printInReverse(struct node *head){
if(head==NULL){
return;
}
printInReverse(head->next);
cout<<head->data<<"\t";
}
void printAlternative(struct node *head){
if(head==NULL){
return;
}
cout<<head->data<<"\t";
if(head->next!=NULL){
printAlternative(head->next->next);
}
}
struct node* reverseListRecursion(struct node** head_first,struct node** head){
struct node *curr=(*head_first);
if(curr->next==NULL){
*head=curr;
return curr;
}
struct node **next=NULL;
next=&(curr->next);
reverseListRecursion(next,head)->next=curr;
return curr;
}
struct node* reverseListIteration(struct node* head){
if(head!=NULL){
struct node* prevN=NULL;
struct node* currN=head;
struct node* nextN=head->next;
while(nextN!=NULL){
currN->next=prevN;
prevN=currN;
currN=nextN;
nextN=nextN->next;
}
currN->next=prevN;
return currN;
}
}
struct node* reverseList(struct node** root,struct node** head,struct node** revHead,int i,int k){
if(root==NULL && i<k){
return NULL;
}
if(i==k){
(*head)=(*root)->next;
(*revHead)=(*root);
return *root;
}
struct node* curr=*root;
struct node* nextN=reverseList(&(curr->next),head,revHead,i+1,k);
if(nextN!=NULL){
nextN->next=curr;
}else{
return NULL;
}
if(i==1 && *head !=NULL){
curr->next=(*head);
return *head;
}
return curr;
}
void reverseAndTraverse(struct node *root, int k,int m){
struct node *kNode=NULL; // K th Node - Assuming Node count from 0 :P
struct node *revHead=NULL;
kNode=reverseList(&root,&kNode,&revHead,1,k);
if(kNode==NULL){
printf("InSufficient Linked List\n");
return;
}
int i=0;
while(i<m && kNode!=NULL){
printf("%d ",kNode->data);
kNode=kNode->next;
i++;
}
cout<<endl;
while(revHead!=NULL){
printf("%d ",revHead->data);
revHead=revHead->next;
}
}
int main(){
struct node *head=NULL;
push(&head,6);
push(&head,5);
push(&head,4);
push(&head,3);
push(&head,2);
push(&head,1);
cout<<"Printing In Normal:\t";
printAll(head);cout<<endl;
cout<<"Printing In Reverse:\t";
printInReverse(head);cout<<endl;
cout<<"Printing In Alternative:\t";
printAlternative(head);cout<<endl;
cout<<"Converting to Reverse:\n";
struct node* revHead=NULL;
reverseListRecursion(&head,&revHead)->next=NULL;
head=revHead;
cout<<"After the Reversal-1:\t";
printAll(head);cout<<endl;
cout<<"Converting to Reverse Again:\n";
head=reverseListIteration(head);
cout<<"After the Reversal-2:\t";
printAll(head);cout<<endl;
cout<<"Perform Reverse of K and Traversal of M \t";
int n=1;
scanf("%d",&n);
reverseAndTraverse(head,n,3);cout<<endl;
}
No comments:
Post a Comment