using System;
using System.Collections.Generic;
using System.Linq;
class MainClass {
static void Main() {
Console.WriteLine("Hello World!");
var list = new DoublyLinkedList(4);
list.Append(9);
list.Prepend(1);
list.Insert(5, 1);
list.Insert(20, 3);
list.PrettyPrint();
list.Remove(2);
list.Remove(3);
list.PrettyPrint();
}
}
public class DoublyLinkedList
{
public DoublyLinkedList(int value)
{
Head = new Node(value);
Tail = Head;
Length = 1;
}
public Node Head { get; set; }
public Node Tail { get; set; }
public int Length { get; set;}
public void Insert(int value, int index)
{
if(index == 0)
{
Prepend(value);
return;
}
if(index == Length)
{
Append(value);
return;
}
if(index >= Length)
{
Console.WriteLine($"{index} out of bounds");
return;
}
Node leader = Head;
//Get node before insert index: leader
for(int k = 0; k < index - 1; k++)
leader = leader.Next;
//Save the current next since it's going to be overwritten
Node after = leader.Next;
Node newNode = new Node(value);
//Save the old node.Next as next in the node being inserted
newNode.Next = after;
newNode.Previous = leader;
after.Previous = newNode
//Overwrite the leader.Next with the new node
leader.Next = newNode;
Length++;
}
public void Remove(int index)
{
Node leader = Head;
for(int k = 0; k < index - 1; k++)
leader = leader.Next;
Node nodeToRemove = leader.Next;
leader.Next = nodeToRemove.Next;
Node newPreviousNode = nodeToRemove.Previous;
Length--;
}
public void Append(int value)
{
var newNode = new Node(value);
newNode.Previous = Tail;
Tail.Next = newNode;
Tail = newNode;
Length++;
}
public void Prepend(int value)
{
Node newNode = new Node(value);
Head.Previous = newNode;
newNode.Next = Head;
Head = newNode;
Length++;
}
public void PrettyPrint()
{
if(Head == null) return;
Node currentNode = Head;
while(currentNode != null)
{
Console.Write(currentNode.Value + (currentNode.Next == null ? string.Empty : " ---> "));
currentNode = currentNode.Next;
}
Console.WriteLine();
}
public class Node
{
public Node(int value)
{
Value = value;
Next = null;
Previous = null;
}
public int Value { get; set; }
public Node Next { get; set; }
public Node Previous { get; set; }
}
}