diff --git a/Data Structures/LinkedList/SinglyLinkedList/README.md b/Data Structures/LinkedList/SinglyLinkedList/README.md index 63870d7..614aa53 100644 --- a/Data Structures/LinkedList/SinglyLinkedList/README.md +++ b/Data Structures/LinkedList/SinglyLinkedList/README.md @@ -1,6 +1,7 @@ -# Singly Linked List +# Singly Linked List ## Complexity +#### Time: - Time: - Access: - Worst Case: ![formula](https://render.githubusercontent.com/render/math?math=O(n)) @@ -15,4 +16,32 @@ - Worst Case: ![formula](https://render.githubusercontent.com/render/math?math=O(1)) - Average Case: ![formula](https://render.githubusercontent.com/render/math?math=O(1)) - Space: - - Worst Case: ![formula](https://render.githubusercontent.com/render/math?math=O(n)) \ No newline at end of file + - Worst Case: ![formula](https://render.githubusercontent.com/render/math?math=O(n)) + + +# Reverse a linked list + + +## Demo +Input: Head of following linked list +1->2->3->4->NULL +Output: Linked list should be changed to, +4->3->2->1->NULL + +Input: Head of following linked list +1->2->3->4->5->NULL +Output: Linked list should be changed to, +5->4->3->2->1->NULL + +## Algorithms +Initialize three pointers prev as NULL, curr as head and next as NULL. +Iterate through the linked list. In loop, do following. +// Before changing next of current, +// store next node +next = curr->next +// Now change next of current +// This is where actual reversing happens +curr->next = prev +// Move prev and curr one step forward +prev = curr +curr = next diff --git a/Data Structures/LinkedList/SinglyLinkedList/ReverseSinglyLinkList.cpp b/Data Structures/LinkedList/SinglyLinkedList/ReverseSinglyLinkList.cpp new file mode 100644 index 0000000..49aead8 --- /dev/null +++ b/Data Structures/LinkedList/SinglyLinkedList/ReverseSinglyLinkList.cpp @@ -0,0 +1,217 @@ +#include + +using namespace std; + + +struct node{ +int data; +struct node * link; +}; + +struct node * start; + +void insertBegin(int item) +{ +node * t= new node; +t->data= item; + +// allocate memory for 1 node variable and t will be pointer to that node +if( start== NULL) +{ +start= t; t->link= NULL; +} +else +{ +t->link= start; +start= t; +} +cout<<" inserted at begin "<data= item; t->link= NULL; +if(start== NULL) +{ +start= t ; +} +else{ + +node * p= start; +while(p->link!= NULL) +{ +p= p->link; +} +p->link= t ; //p stores adress of current last node + +} +cout<<"inserted at last "<data<<"-> "; +p= p->link; +} +cout<<"NULL"<data) +{ +cout<<" found "<link; +} +} +cout<<" not found "<data= item; +if( start== NULL) +{ +start= t; t->link= NULL; +} +else +{ +node * p= start; +while(p!= NULL) +{ +if(val==p->data) +{ +t->link= p->link; +p->link= t; +return; +} +else +{ +p=p->link; +} +} + +} + +} + +void deleteBegin() +{ +if(start== NULL) +{ +cout<<"List is empty "<link==NULL) +{ +node *p= start; +start= NULL; +delete p; +} +else +{ +node *p= start; +start= start->link; +delete p; +} +} +void deleteLast() +{ +if(start==NULL) +{ +cout<<"List is empty "<link==NULL) +{ +node *p= start; +start= NULL; +delete p; +} +else +{ +node *p,*t; +p= start; +while(p->link!= NULL) +{ +t=p; +p=p->link; +} +t->link= NULL; +delete p; +} +} + +node * getMaxNode(){ +node *t,*p; + +if(start==NULL){ return NULL;} +else +{ +p= start; +int mx= p->data; t= p; +while(p!= NULL) +{ +if(mxdata ) +{ +mx= p->data; +t= p; +} + +p= p->link; +} + +} +return t; +} + +void reverseList() +{ + node * pre; + node * curr; + node * next; + pre = NULL; + curr= start; + next = NULL; + while (curr!=NULL) + + { + next= curr->link; + curr->link= pre; + pre = curr; + curr= next; + + } start= pre; + + return; +} +int main() +{ +insertLast(11); +insertBegin(20); +insertBegin(25); +insertBegin(30); + +traverse(); +/*searchItem(25); +searchItem(40); +insertLast(22); +traverse(); +insertAfter(20,70); +traverse(); +deleteBegin(); +traverse(); +deleteLast(); +traverse();*/ +reverseList(); +traverse(); +} \ No newline at end of file