C Code Consider the LinkedList class and the Node class that
C++ Code
Consider the LinkedList class and the Node class that we saw in lecture. The LinkedList class basically represents a singly linked list.
Now, for this lab, consider a doubly linked list, i.e. each node has a next and previous pointers to the next and previous node, respectively.
Modify the Node class to reflect this change and implement the following methods for DoublyLinkedList class:
addFirst
addLast
addAtIndex
removeFirst
removeLast
removeAtIndex
Note: We saw how to implement these methods for a singly linked list and the code is added as an attachment.
C++ Code
***********************************************************************************************
***********************************************************************************************
C++ Code
Solution
 #include <stdio.h>
 #include <iostream>
using namespace std;
template <class T>
 class Node
 {
 public:
 T element; // Element contained in the node
 Node *next; // Pointer to the next node
 Node *previous;
Node(T element) // Constructor
 {
 this->element = element;
 next = NULL;
   
 }
 };
template <class T>
 class LinkedList
 {
 public:
 LinkedList();
 void addFirst(T element);
 void addLast(T element);
 T removeFirst() ;
 T removeLast();
 void addAtIndex(int index, T element);
 T removeAtIndex(int index);
 void traverseList();
private:
 Node<T> *head;
 Node<T> *tail;
 int size;
 };
template <class T>
 LinkedList<T>::LinkedList()
 {
 head = NULL;
 tail = NULL;
 size = 0;
 }
template <class T>
 void LinkedList<T>::addFirst(T element)
 {
 Node<T> *newNode = new Node<T>(element);
 newNode->next = head;
 if(head != NULL) {
 head->previous = newNode;
 }
 newNode->previous = NULL;
 head = newNode;
 size++;
if (tail == NULL)
 tail = head;
 }
template <class T>
 void LinkedList<T>::addLast(T element)
 {
 if (tail == NULL)
 {
 head = tail = new Node<T>(element);
 }
 else {
 tail->next = new Node<T>(element);
 tail = tail->next;
 }
size++;
 }
template <class T>
 void LinkedList<T>::addAtIndex(int index, T element)
 {
 if (index == 0)
 addFirst(element);
 else if (index >= size)
 addLast(element);
 else
 {
 Node<T> *current = head;
 for (int i = 1; i < index; i++)
 current = current->next;
 Node<T> *temp = current->next;
 current->next = new Node<T>(element);
 (current->next)->next = temp;
 size++;
 }
 }
template <class T>
 T LinkedList<T>::removeFirst()
 {
 if (size == 0)
 exit(1);
 else
 {
 Node<T> *temp = head;
 head = head->next;
 size--;
 T element = temp->element;
 delete temp;
 return element;
 }
 }
template <class T>
 T LinkedList<T>::removeLast()
 {
 if (size == 0)
 exit(1);
 else if (size == 1)
 {
 Node<T> *temp = head;
 head = tail = NULL;
 size = 0;
 T element = temp->element;
 delete temp;
 return element;
 }
 else
 {
 Node<T> *current = head;
for (int i = 0; i < size - 2; i++)
 current = current->next;
Node<T> *temp = tail;
 tail = current;
 tail->next = NULL;
 size--;
 T element = temp->element;
 delete temp;
 return element;
 }
 }
template <class T>
 T LinkedList<T>::removeAtIndex(int index)
 {
 if (index < 0 || index >= size)
 exit(1);
 else if (index == 0)
 return removeFirst();
 else if (index == size - 1)
 return removeLast();
 else {
 Node<T> *previous = head;
for (int i = 1; i < index; i++)
 {
 previous = previous->next;
 }
Node<T> *current = previous->next;
 previous->next = current->next;
 size--;
 T element = current->element;
 delete current;
 return element;
 }
 }
template <class T>
 void LinkedList<T>::traverseList()
 {
 Node<T> *temp = head;
 while(temp !=NULL) {
    cout<<temp->element<<\"\ \";
    temp = temp->next;
 }
   
 }
 int main() {
    LinkedList<int> *myList = new LinkedList<int>();
    myList->addFirst(10);
    myList->addFirst(20);
    myList->addLast(30);
    myList->removeAtIndex(1);
    myList->traverseList();
    delete myList;
 }




