#include <iostream>
class
SinglyLList {
private
:
class
Node {
public
:
int
data;
Node* next;
Node(
int
data)
{
this
->data = data;
this
->next = nullptr;
}
};
Node* head;
public
:
SinglyLList() { head = nullptr; }
void
InsertAtStart(
int
data)
{
Node* new_node =
new
Node(data);
new_node->next = head;
head = new_node;
}
void
InsertAtLast(
int
data)
{
Node* new_node =
new
Node(data);
if
(head == nullptr) {
head = new_node;
return
;
}
new_node->next = nullptr;
Node* last = head;
while
(last->next != nullptr) {
last = last->next;
}
last->next = new_node;
}
void
DeleteAtStart()
{
if
(head == nullptr) {
std::cout <<
"List is empty"
<< std::endl;
return
;
}
head = head->next;
}
void
DeleteAtPos(
int
pos)
{
int
position = 0;
if
(pos > Count() || pos < 0) {
throw
"Incorrect position exception"
;
}
Node* temp = head;
while
(position != pos - 1) {
temp = temp->next;
position++;
}
temp->next = temp->next->next;
}
void
DeleteAtLast()
{
Node* delete_node = head;
while
(delete_node->next != nullptr
&& delete_node->next->next != nullptr) {
delete_node = delete_node->next;
}
delete_node->next = nullptr;
}
void
Display()
{
Node* disp = head;
while
(disp != nullptr) {
std::cout << disp->data <<
"->"
;
disp = disp->next;
}
}
int
Count()
{
int
elements = 0;
Node* count = head;
while
(count != nullptr) {
count = count->next;
elements++;
}
return
elements;
}
};
int
main()
{
SinglyLList list;
list.InsertAtStart(3);
list.InsertAtStart(2);
list.InsertAtStart(1);
list.Display();
std::cout << std::endl;
list.InsertAtLast(1);
std::cout <<
"after inserting node at the end\n"
;
list.Display();
std::cout << std::endl;
list.DeleteAtPos(1);
list.DeleteAtStart();
list.DeleteAtLast();
std::cout
<<
"after deleting node: second, first and last\n"
;
list.Display();
std::cout << std::endl;
return
0;
}