// c++ program to create a linked list insert element at head, at tail and delete element from
// tail, head and specific key
#include <iostream>
using namespace std;
struct Node
{
public:
int data;
Node *next;
Node(int data)
{
this->data = data;
this->next = NULL;
}
};
void insertAtHead(Node *&head, int data)
{
Node *NewNode = new Node(data);
NewNode->next = head;
head = NewNode;
}
void insertAtTail(Node *&head, int data)
{
Node *NewNode = new Node(data);
if (head == NULL)
{
NewNode->next = head;
head = NewNode;
return;
}
Node *temp = head;
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = NewNode;
cout << "the value of temp next is " << temp->data << endl;
}
void insertAtKey(Node *&head, int key, int data)
{
Node *NewNode = new Node(data);
if (head->data == key)
{
NewNode->next = head->next;
head->next = NewNode;
return;
}
Node *temp = head;
while (temp->data != key)
{
temp = temp->next;
if (temp == NULL)
return;
}
NewNode->next = temp->next;
temp->next = NewNode;
}
void print(Node *&head)
{
if (head == NULL)
{
cout << head->data << " -> ";
}
Node *temp = head;
while (temp != NULL)
{
/* code */
cout << temp->data << " -> ";
temp = temp->next;
}
}
void deleteNode(Node *&head, int key)
{
if (head == NULL)
return;
if (head->data == key)
{
Node *temp = head;
head = head->next;
delete temp;
}
deleteNode(head->next, key);
}
// recursive approach to reverse the linked list
Node *Reverse(Node *&head)
{
if (head == NULL || head->next == NULL)
return head;
Node *NewHead = Reverse(head->next);
head->next->next = head;
head->next = NULL;
return NewHead;
}
//this function reverse the k nodes in linked list
Node*Reversek(Node*&head,int k){
//first we have to make three node pointers
Node *prevPtr = NULL;//the prev ptr points to Null
Node *currPtr = head;//the next ptr should points toward the prev ptr because we have to reverse
//the nodes this is possible if we point the next node towards the prev node
Node *nextptr=NULL;//we will assign the value to nextptr in the loop
int count = 0;
while(currPtr!=NULL && count<k)
{
nextptr = currPtr->next;
currPtr->next = prevPtr;
prevPtr = currPtr;
currPtr = nextptr;
count++;
}
if(nextptr!=NULL){
head->next = Reversek(nextptr, k);
}
return prevPtr;
}
int main()
{
Node *head = NULL;
cout << "insert At head" << endl;
insertAtHead(head, 3);
insertAtHead(head, 2);
print(head);
cout << endl;
cout << "Insert at Tail " << endl;
insertAtTail(head, 4);
insertAtTail(head, 5);
insertAtTail(head, 6);
insertAtTail(head, 10);
insertAtTail(head, 9);
insertAtKey(head, 10, 45);
print(head);
deleteNode(head, 2);
cout << "deleting the head" << endl;
print(head);
cout << endl;
cout << "reversing the linked list " << endl;
Node *NewHead = Reverse(head);
print(NewHead);
cout << endl;
cout << "reversing the k nodes in linked list " << endl;
Node *NewRev = Reversek(NewHead,2);
print(NewRev);
}