双向链表顾名思义最大的特点就是可以双向遍历,为了实现这个特点,它不得不给自己添加两个指针,一个指向前一节点,一个指向后一节点,当然数据域是无异于其他链表的,可以是你想要的任何类型。在此,双向链表实现了链表基本的一些操作,链表头/尾添加节点、中间添加节点、删除节点、遍历链表(前->后/后->前遍历),废话不多说,看代码...
using System;
namespace OverrideTest
{
// Classs Node
class Node
{
// Data
public object Data;
// Pre Node
public Node PreviousNode;
// Next Node
public Node NextNode;
public Node(object data = null)
{
Data = data;
PreviousNode = null;
NextNode = null;
}
public override string ToString()
{
return Data.ToString();
}
}
// Class List
class MyLinkedList
{
// Define first and last Node
public Node First;
public Node Last;
// Count of Node
public int Count;
public MyLinkedList()
{
First = null;
Last = null;
Count = 0;
}
// Add node2 after node1
public void AddAfter(Node node1, Node node2)
{
// The list is null
if (First == null)
{
Console.WriteLine("Linked list is null!");
return;
}
Node temp = First;
do
{
if (temp.Data.Equals(node1.Data))
{
// node 1 is the last node
if (node1.NextNode == null)
{
AddLast(node2);
}
else // node1 is not the last node
{
node2.NextNode = node1.NextNode;
node2.PreviousNode = node1;
node2.NextNode.PreviousNode = node2;
node1.NextNode = node2; ;
}
Count++;
return;
}
temp = temp.NextNode;
}
while (temp != null);
}
public void AddFirst(Node node)
{
if (First == null)
{
node.NextNode = null;
node.PreviousNode = null;
First = node;
Last = node;
}
else
{
Node temp = First;
node.PreviousNode = null;
node.NextNode = temp;
temp.PreviousNode = node;
First = node;
}
}
public void AddLast(Node node)
{
// The list is null
if (First == null)
{
node.NextNode = null;
node.PreviousNode = null;
First = node;
Last = node;
}
else // The list is not null
{
Node temp = First;
while (temp.NextNode != null)
{
temp = temp.NextNode;
}
temp.NextNode = node;
node.PreviousNode = temp;
Last = node;
}
Count++;
}
// Delete a node
public void Delete(Node node)
{
if (First == null)
{
Console.WriteLine("Can't delete node , because the list null!");
return;
}
Node temp = First;
do
{
// Find the node
if (temp.Data.Equals(node.Data))
{
// The list has only one node
if (temp.PreviousNode == null && temp.NextNode == null)
{
Console.WriteLine("Only one node deleted!");
First = null;
Last = null;
temp = null;
}
else if(temp.PreviousNode == null && temp.NextNode != null) // The list has many nodes, delete the first one
{
Console.WriteLine("Many nodes , delete first node!");
First = First.NextNode;
temp.NextNode.PreviousNode = null;
temp.NextNode = null;
}
else if(temp.PreviousNode != null && temp.NextNode == null) // The list has many nodes, delete the last one
{
Console.WriteLine("Many nodes , delete last node!");
Last = Last.PreviousNode;
temp.PreviousNode.NextNode = null;
temp.PreviousNode = null;
}
else
{
Console.WriteLine("Many nodes , delete a normal node!");
temp.PreviousNode.NextNode = temp.NextNode;
temp.NextNode.PreviousNode = temp.PreviousNode;
temp = null;
}
Count--;
Console.WriteLine("Node (" + node + ") deleted!");
return;
}
temp = temp.NextNode;
}
while (temp != null);
}
// Modify a node
public void Modify(Node node, object value)
{
if (First == null)
{
Console.WriteLine("Can't modify because the list is null!");
return;
}
Node temp = First;
do
{
if (temp.Data.Equals(node.Data))
{
temp.Data = value;
return;
}
temp = temp.NextNode;
}
while (temp != null);
}
// Print the list
public void PrintFromFirst()
{
if (First == null)
{
Console.WriteLine("There is no node in this linked list!");
return;
}
else
{
Console.WriteLine("Print the linked list begin...");
Node temp = First;
do
{
Console.WriteLine(temp.ToString());
temp = temp.NextNode;
}
while (temp != null);
Console.WriteLine("Print the linked list end!");
}
}
public void PrintFromLast()
{
if (Last == null)
{
Console.WriteLine("This is no node in this linked list!");
}
else
{
Console.WriteLine("Print the linked list from Last begin!");
Node temp = Last;
do
{
Console.WriteLine(temp.ToString());
temp = temp.PreviousNode;
}
while (temp != null);
Console.WriteLine("Print the linked list from Last end!");
}
}
}
class Program
{
static void Main(string[] args)
{
MyLinkedList myList = new MyLinkedList();
Node n1 = new Node("Mapenghan");
Node n2 = new Node("Bryant");
Node n3 = new Node("Iverson");
myList.AddLast(n1);
myList.AddLast(n2);
myList.AddFirst(n3);
Node n4 = new Node("Lakers");
Node n5 = new Node("Suns");
Node n6 = new Node("Clippers");
myList.AddAfter(n1, n4);
myList.AddAfter(n2, n5);
myList.AddAfter(n3, n6);
Console.WriteLine("*********************************");
myList.PrintFromFirst();
Console.WriteLine("*********************************");
myList.Delete(n2);
myList.Modify(n5, "SunsModified!");
Console.WriteLine("*********************************");
myList.PrintFromLast();
Console.WriteLine("*********************************");
}
}
}