Blue Theme Orange Theme Green Theme Red Theme
 
Nevron Chart
Home | Forums | Videos | Advertise | Certifications | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
Nevron Chart
Search :       Advanced Search »
Home » C# Language » Using Linked List in C#

Using Linked List in C#

What we going to make is a linked list. Yeah I know there is a class which does the same as a linked list called ArrayList, but we (as a diehard C# programmer) want absolute control and knowledge of what we use.

Page Views : 237975
Downloads : 1358
Rating :
 Rate it
Level : Intermediate
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
Download Files:
LinkedListInCS.zip
 
 
Discover the top 5 tips for understanding .NET Interop
Become a Sponsor
Team Foundation Server Hosting
Become a Sponsor
 Tag Cloud
 Latest Jobs
More ... 
 Latest Interview Questions
More ... 

What we going to make is a linked list. Yeah I know there is a class which does the same as a linked list called ArrayList, but we (as a diehard C# programmer) want absolute control and knowledge of what we use.

First what is a linked list?

A linked list is a dynamically sized array. An array has a size and you have to deal with it you cant just resize an array. Unlike an array a linked list has no absolute size. It can hold as many variables as you want it to.

When to use?

In circumstances where you dont know how many variables you want to add. For example it could be just 1 or it could be 1000. In such a situation its stupid to make an array of 10000 it would be a waist of memory.

Now a design of our classes LinkedList and Node.

Note: Prefix i is for an integer and a prefix n is for a Node.

In the Node class there is a Previous and a Next Node. Because of that all Nodes are linked to eachother (thats why they called it a linkedlist).

Here is the Node class

public class Node
{
protected Node nPrevious;
protected Node nNext;
protected object Object;
#region Properties
public object Value
{
get
{
return Object;
}
set
{
Object =
value;
}
}
public Node Previous
{
get
{
return nPrevious;
}
set
{
nPrevious =
value;
}
}
public Node Next
{
get
{
return nNext;
}
set
{
nNext =
value;
}
}
#endregion
public Node(Node PrevNode, Node NextNode, object obj)
{
nPrevious = PrevNode;
nNext = NextNode;
Object = obj;
}
}

As you can see there isnt much of a surprise
if you studied the class design.

Next thing the LinkedList class.

public class LinkedList
{
int iCount = 1;
int iCurrent = 0;
Node nCurrent;
#region Properties
/// <summary>
/// Give back how many nodes there are.
/// </summary>
public int Count
{
get
{
return iCount;
}
}
/// <summary>
/// Gives back the current Node
/// </summary>
public Node CurrentNode
{
get
{
return nCurrent;
}
}
/// <summary>
/// Keeps track of the index where you are
/// </summary>
public int CurrentNodeIndex
{
get
{
return iCurrent;
}
}
#endregion
/// <summary>
/// Default and only Constructor
/// SetUp our LinkedList
/// </summary>
/// <param name="obj">Value for the first Node</param>
public LinkedList(object obj)
{
nCurrent =
new Node(null, null, obj);
nCurrent.Next =
null;
nCurrent.Previous =
null;
}
/// <summary>
/// This function will add another Node
/// </summary>
/// <param name="obj">Value for the added Node</param>
public void AddNode(object obj)
{
if(nCurrent.Next == null)
{
nCurrent = nCurrent.Next =
new Node(nCurrent, null, obj);
}
else
{
nCurrent = nCurrent.Next =
new Node(nCurrent, nCurrent.Next,obj);
}
iCount++;
iCurrent++;
}
/// <summary>
/// Goes to the next Node
/// </summary>
public void ToNext()
{
// Checks whether the Next Node is null
// if so it throws an exception.
// You can also do nothing but I choos for this.
if(nCurrent.Next == null)
{
throw new Exception("There is no next node!");
}
else // If everything is OK
{
nCurrent = nCurrent.Next;
iCurrent++;
}
}
/// <summary>
/// Goes to the previous Node
/// </summary>
public void ToPrevious()
{
// Look at ToNext();
if(nCurrent.Previous == null)
{
throw new Exception("There is no previous node!");
}
else
{
nCurrent = nCurrent.Previous;
iCurrent--;
}
}
/// <summary>
/// Goes to the index you fill in
/// </summary>
/// <param name="index">Index Where to go?</param>
public void GoTo(int index)
{
if(iCurrent < index)
{
ToNext();
}
else if(iCurrent > index)
{
ToPrevious();
}
}
}

Conclusion:

It isnt hard to make a linked list and I guess most programmers are already familiar with linked lists. And for the C++ programmers out there you see without pointers :p ( I just hate pointers)

Comment Request!
Thank you for reading this post. Please post your feedback, question, or comments about this post Here.
Login to add your contents and source code to this article
 Article Extensions
Contents added by isma perez on Apr 12, 2011
Contents added by Mahesh Chand on Aug 25, 2010
C# 2.0 and later versions provides the LinkedList<T> generic class that represents a doubly linked list.

Here is an example from MSDN on how to use LinkedList generic class.


using System;

using System.Text;

using System.Collections.Generic;

 

public class Example

{

    public static void Main()

    {

        // Create the link list.

        string[] words =

            { "the", "fox", "jumped", "over", "the", "dog" };

        LinkedList<string> sentence = new LinkedList<string>(words);

        Display(sentence, "The linked list values:");

        Console.WriteLine("sentence.Contains(\"jumped\") = {0}",

            sentence.Contains("jumped"));

 

        // Add the word 'today' to the beginning of the linked list.

        sentence.AddFirst("today");

        Display(sentence, "Test 1: Add 'today' to beginning of the list:");

 

        // Move the first node to be the last node.

        LinkedListNode<string> mark1 = sentence.First;

        sentence.RemoveFirst();

        sentence.AddLast(mark1);

        Display(sentence, "Test 2: Move first node to be last node:");

 

        // Change the last node be 'yesterday'.

        sentence.RemoveLast();

        sentence.AddLast("yesterday");

        Display(sentence, "Test 3: Change the last node to 'yesterday':");

 

        // Move the last node to be the first node.

        mark1 = sentence.Last;

        sentence.RemoveLast();

        sentence.AddFirst(mark1);

        Display(sentence, "Test 4: Move last node to be first node:");

 

 

        // Indicate, by using parentheisis, the last occurence of 'the'.

        sentence.RemoveFirst();

        LinkedListNode<string> current = sentence.FindLast("the");

        IndicateNode(current, "Test 5: Indicate last occurence of 'the':");

 

        // Add 'lazy' and 'old' after 'the' (the LinkedListNode named current).

        sentence.AddAfter(current, "old");

        sentence.AddAfter(current, "lazy");

        IndicateNode(current, "Test 6: Add 'lazy' and 'old' after 'the':");

 

        // Indicate 'fox' node.

        current = sentence.Find("fox");

        IndicateNode(current, "Test 7: Indicate the 'fox' node:");

 

        // Add 'quick' and 'brown' before 'fox':

        sentence.AddBefore(current, "quick");

        sentence.AddBefore(current, "brown");

        IndicateNode(current, "Test 8: Add 'quick' and 'brown' before 'fox':");

 

        // Keep a reference to the current node, 'fox',

        // and to the previous node in the list. Indicate the 'dog' node.

        mark1 = current;

        LinkedListNode<string> mark2 = current.Previous;

        current = sentence.Find("dog");

        IndicateNode(current, "Test 9: Indicate the 'dog' node:");

 

        // The AddBefore method throws an InvalidOperationException

        // if you try to add a node that already belongs to a list.

        Console.WriteLine("Test 10: Throw exception by adding node (fox) already in the list:");

        try

        {

            sentence.AddBefore(current, mark1);

        }

        catch (InvalidOperationException ex)

        {

            Console.WriteLine("Exception message: {0}", ex.Message);

        }

        Console.WriteLine();

 

        // Remove the node referred to by mark1, and then add it

        // before the node referred to by current.

        // Indicate the node referred to by current.

        sentence.Remove(mark1);

        sentence.AddBefore(current, mark1);

        IndicateNode(current, "Test 11: Move a referenced node (fox) before the current node (dog):");

 

        // Remove the node referred to by current.

        sentence.Remove(current);

        IndicateNode(current, "Test 12: Remove current node (dog) and attempt to indicate it:");

 

        // Add the node after the node referred to by mark2.

        sentence.AddAfter(mark2, current);

        IndicateNode(current, "Test 13: Add node removed in test 11 after a referenced node (brown):");

 

        // The Remove method finds and removes the

        // first node that that has the specified value.

        sentence.Remove("old");

        Display(sentence, "Test 14: Remove node that has the value 'old':");

 

        // When the linked list is cast to ICollection(Of String),

        // the Add method adds a node to the end of the list.

        sentence.RemoveLast();

        ICollection<string> icoll = sentence;

        icoll.Add("rhinoceros");

        Display(sentence, "Test 15: Remove last node, cast to ICollection, and add 'rhinoceros':");

 

        Console.WriteLine("Test 16: Copy the list to an array:");

        // Create an array with the same number of

        // elements as the inked list.

        string[] sArray = new string[sentence.Count];

        sentence.CopyTo(sArray, 0);

 

        foreach (string s in sArray)

        {

            Console.WriteLine(s);

        }

 

        // Release all the nodes.

        sentence.Clear();

 

        Console.WriteLine();

        Console.WriteLine("Test 17: Clear linked list. Contains 'jumped' = {0}",

            sentence.Contains("jumped"));

 

        Console.ReadLine();

    }

 

    private static void Display(LinkedList<string> words, string test)

    {

        Console.WriteLine(test);

        foreach (string word in words)

        {

            Console.Write(word + " ");

        }

        Console.WriteLine();

        Console.WriteLine();

    }

 

    private static void IndicateNode(LinkedListNode<string> node, string test)

    {

        Console.WriteLine(test);

        if (node.List == null)

        {

            Console.WriteLine("Node '{0}' is not in the list.\n",

                node.Value);

            return;

        }

 

        StringBuilder result = new StringBuilder("(" + node.Value + ")");

        LinkedListNode<string> nodeP = node.Previous;

 

        while (nodeP != null)

        {

            result.Insert(0, nodeP.Value + " ");

            nodeP = nodeP.Previous;

        }

 

        node = node.Next;

        while (node != null)

        {

            result.Append(" " + node.Value);

            node = node.Next;

        }

 

        Console.WriteLine(result);

        Console.WriteLine();

    }

}

 

 [Top] Rate this article
 
 About the author
 
Jay Smith
Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
Discover the Top 5 .NET Memory Management Fundamentals
To write the best .NET code, you need to know exactly how the .NET framework really manages memory. Ricky Leeks presents the Top 5 fundamental facts of .NET memory management. Learn more.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
ASP.NET 4 Hosting
Get 2 Months Free of ASP.NET Hosting for Only $4.95/month! Receive FREE MS SQL and MySQL Databases Including ASP.NET 4/3.5, MVC 3.0, Silverlight 4, Windows 2008/IIS 7.0 Plus FREE IIS 7 Modules. Host UNLIMITED ASP.NET Web Sites – Click Here!
 
 Post a Feedback, Comment, or Question about this article
Subject:
Comment:
Nevron Chart
Become a Sponsor
 Comments
sortable list by Hamid On February 26, 2008
Hi, would you help me to write a sortable binding list? in fact i want to have a class that be able to bind to datagridview and be sortable thank you for sharing
Reply | Email | Modify 
GoTo(index) by Anuradha On October 8, 2008
say for ex iCurrent = 5 We call GoTo(3); Now shudn't be ToPrevious() called twice? code should be as below: if( iCurrent > index ) { while( iCurrent - index) { ToPrevious(); index++; } } Similarly for other condition.
Reply | Email | Modify 
class vs. struct for Node by Anand On February 25, 2010
why would you not use a struct and define Node as a class? I'm trying to understand when to use a struct vs when to use a class.
Reply | Email | Modify 
Not exactly... by Memorandis On May 27, 2010
That implementation is indeed a linked list, but a linked list is not an "array," dynamically-sized or otherwise, and ArrayList is not a linked list.  In fact, C# uses LinkedList to represent a linked list.  The difference is that dynamically-sized arrays are still contiguous in memory and linked lists are not.  This will make insertion and deletion faster with linked lists but retrieving an element faster with ArrayList.
Reply | Email | Modify 
LinkedList generic class by Mahesh On August 25, 2010
You can also use LinkedList<T> generic class available in C# 2.0 or later versions.
Reply | Email | Modify 
goto fix by sam On November 20, 2010
so i think the goto should be:

        /// <summary>
        /// Goes to the index you fill in
        /// </summary>
        /// <param name="index">Index Where to go?</param>
        public void GoTo(int index)
        {
            if (iCurrent < index)
            {
                ToNext();
                GoTo(index);
            }
            else if (iCurrent > index)
            {
                ToPrevious();
                GoTo(index);
            }
        }
Reply | Email | Modify 
goto fix... by Tamus On December 10, 2010
// 1. Recursion can blow the stack on large linked lists. // 2. Where is iCurrent changing? This will blow the stack. // "Blowing the stack" is where a function calls itself too many times. // <summary> // Iterates to the index you specify. // </summary> public void GoTo(int index) { while (iCurrent < index) { ToNext(); iCurrent += 1; } // End while while (iCurrent > index) { ToPrev(); iCurrent -= 1; } // End while } // End GoTo() Method
Reply | Email | Modify 
6 Months Free & No Setup Fees ASP.NET Hosting!
 © 2012  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.