C# 创建一个非常简单的链表

C# 创建一个非常简单的链表,c#,linked-list,C#,Linked List,我正试图创建一个链接列表,只是想看看我是否可以,但我很难理解它。有人举过一个使用C#实现链表的简单例子吗?到目前为止,我发现的所有例子都有些过头了 这个很好: namespace ConsoleApplication1 { // T is the type of data stored in a particular instance of GenericList. public class GenericList<T> { pr

我正试图创建一个链接列表,只是想看看我是否可以,但我很难理解它。有人举过一个使用C#实现链表的简单例子吗?到目前为止,我发现的所有例子都有些过头了

这个很好:

  namespace ConsoleApplication1
    {

    // T is the type of data stored in a particular instance of GenericList.
    public class GenericList<T>
    {
        private class Node
        {
            // Each node has a reference to the next node in the list.
            public Node Next;
            // Each node holds a value of type T.
            public T Data;
        }

        // The list is initially empty.
        private Node head = null;

        // Add a node at the beginning of the list with t as its data value.
        public void AddNode(T t)
        {
            Node newNode = new Node();
            newNode.Next = head;
            newNode.Data = t;
            head = newNode;
        }

        // The following method returns the data value stored in the last node in
        // the list. If the list is empty, the default value for type T is
        // returned.
        public T GetFirstAdded()
        {
            // The value of temp is returned as the value of the method. 
            // The following declaration initializes temp to the appropriate 
            // default value for type T. The default value is returned if the 
            // list is empty.
            T temp = default(T);

            Node current = head;
            while (current != null)
            {
                temp = current.Data;
                current = current.Next;
            }
            return temp;
        }
    }
}
命名空间控制台应用程序1
{
//T是存储在GenericList特定实例中的数据类型。
公共类泛型列表
{
私有类节点
{
//每个节点都有对列表中下一个节点的引用。
公共节点下一步;
//每个节点持有一个类型为T的值。
公共数据;
}
//列表最初为空。
私有节点头=null;
//在列表的开头添加一个节点,其数据值为t。
公共无效添加节点(T)
{
Node newNode=新节点();
newNode.Next=head;
newNode.Data=t;
头=新节点;
}
//以下方法返回存储在中最后一个节点中的数据值
//列表。如果列表为空,则类型T的默认值为
//返回。
公共T GetFirstAdded()
{
//temp的值作为方法的值返回。
//以下声明将temp初始化为适当的
//类型T的默认值。如果
//列表为空。
T温度=默认值(T);
节点电流=头;
while(当前!=null)
{
温度=当前数据;
当前=当前。下一步;
}
返回温度;
}
}
}
测试代码:

static void Main(string[] args)
{
    // Test with a non-empty list of integers.
    GenericList<int> gll = new GenericList<int>();
    gll.AddNode(5);
    gll.AddNode(4);
    gll.AddNode(3);
    int intVal = gll.GetFirstAdded();
    // The following line displays 5.
    System.Console.WriteLine(intVal);
}
static void Main(字符串[]args)
{
//使用非空整数列表进行测试。
GenericList gll=新的GenericList();
gll.AddNode(5);
gll.AddNode(4);
gll.AddNode(3);
int intVal=gll.GetFirstAdded();
//下一行显示5。
系统控制台写入线(intVal);
}

我在msdn上遇到了它,它是一个链表,其核心是一组链接在一起的节点

因此,您需要从一个简单的节点类开始:

public class Node {
    public Node next;
    public Object data;
}
然后,您的链接列表将有一个节点作为成员,代表列表的开头(开始):

public class LinkedList {
    private Node head;
}
然后,您需要通过添加方法向列表中添加功能。它们通常涉及沿所有节点的某种遍历

public void printAllNodes() {
    Node current = head;
    while (current != null) 
    {
        Console.WriteLine(current.data);
        current = current.next;
    }
}
此外,插入新数据是另一种常见操作:

public void Add(Object data) {
    Node toAdd = new Node();
    toAdd.data = data;
    Node current = head;
    // traverse all nodes (see the print all nodes method for an example)
    current.next = toAdd;
}

这应该是一个很好的起点。

我是一个初学者,这有助于我:

class List
{
    private Element Root;
}
首先创建包含所有方法的类列表。 然后创建Node类,我将其称为Element

class Element
{
    public int Value;
    public Element Next;
}
然后可以开始向List类添加方法

public void Add(int value)
{
    Element newElement = new Element();
    newElement.Value = value;

    Element rootCopy = Root;
    Root = newElement;
    newElement.Next = rootCopy;

    Console.WriteLine(newElement.Value);
}
使用:

LinkedList sample = new LinkedList();
sample.add(new Node("first"));
sample.Add(new Node("second"))

根据@jjnguy所说的,并修复了他的PrintAllNodes()中的错误,下面是完整的控制台应用程序示例:

public class Node
{
    public Node next;
    public Object data;
}

public class LinkedList
{
    private Node head;

    public void printAllNodes()
    {
        Node current = head;
        while (current != null)
        {
            Console.WriteLine(current.data);
            current = current.next;
        }
    }

    public void AddFirst(Object data)
    {
        Node toAdd = new Node();

        toAdd.data = data;
        toAdd.next = head;

        head = toAdd;
    }

    public void AddLast(Object data)
    {
        if (head == null)
        {
            head = new Node();

            head.data = data;
            head.next = null;
        }
        else
        {
            Node toAdd = new Node();
            toAdd.data = data;

            Node current = head;
            while (current.next != null)
            {
                current = current.next;
            }

            current.next = toAdd;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Add First:");
        LinkedList myList1 = new LinkedList();

        myList1.AddFirst("Hello");
        myList1.AddFirst("Magical");
        myList1.AddFirst("World");
        myList1.printAllNodes();

        Console.WriteLine();

        Console.WriteLine("Add Last:");
        LinkedList myList2 = new LinkedList();

        myList2.AddLast("Hello");
        myList2.AddLast("Magical");
        myList2.AddLast("World");
        myList2.printAllNodes();

        Console.ReadLine();
    }
}
使用以下各项进行测试:

static void Main(string[] args)
{
    DynamicLinkedList list = new DynamicLinkedList();
    list.AddAtLastPosition(1);
    list.AddAtLastPosition(2);
    list.AddAtLastPosition(3);
    list.AddAtLastPosition(4);
    list.AddAtLastPosition(5);

    object lastElement = list.GetLastElement();
    Console.WriteLine(lastElement);
}
公共类节点
{
公共交通项目;
公共节点下一步;
公共节点()
{
this.next=null;
}
}
类链接列表
{
公共节点头{get;set;}
公共链接列表()
{
this.head=null;
}
公共无效附加项(T项)
{
Node newNode=新节点();
newNode.item=项目;
if(this.head==null)
{
this.head=newNode;
}
其他的
{
newNode.next=头部;
this.head=newNode;
}
}
公共无效附加项(T项)
{
Node newNode=新节点();
newNode.item=项目;
if(this.head==null)
{
this.head=newNode;
}
其他的
{
节点温度=this.head;
while(temp.next!=null)
{
温度=下一个温度;
}
temp.next=newNode;
}
}
公共无效删除节点(T项)
{
如果(本标题项目等于(项目))
{
head=head.next;
}
其他的
{
节点温度=头;
节点温度=头部;
布尔匹配=假;
而(!(matched=temp.item.Equals(item))&&temp.next!=null)
{
tempPre=温度;
温度=下一个温度;
}
如果(匹配)
{
tempre.next=temp.next;
}
其他的
{
Console.WriteLine(“找不到值!”);
}
}
}
公共布尔搜索节点(T项)
{
节点温度=this.head;
布尔匹配=假;
而(!(matched=temp.item.Equals(item))&&temp.next!=null)
{
温度=下一个温度;
}
返回匹配;
}
公共void显示列表()
{
Console.WriteLine(“显示列表!”);
节点温度=this.head;
while(temp!=null)
{
控制台写入线(临时项目);
温度=下一个温度;
}
}
}

Dmytro做得很好,但这里有一个更简洁的版本

class Program
{
    static void Main(string[] args)
    {
        LinkedList linkedList = new LinkedList(1);

        linkedList.Add(2);
        linkedList.Add(3);
        linkedList.Add(4);

        linkedList.AddFirst(0);

        linkedList.Print();            
    }
}

public class Node
{
    public Node(Node next, Object value)
    {
        this.next = next;
        this.value = value;
    }

    public Node next;
    public Object value;
}

public class LinkedList
{
    public Node head;

    public LinkedList(Object initial)
    {
        head = new Node(null, initial);
    }

    public void AddFirst(Object value)
    {
        head = new Node(head, value);            
    }

    public void Add(Object value)
    {
        Node current = head;

        while (current.next != null)
        {
            current = current.next;
        }

        current.next = new Node(null, value);
    }

    public void Print()
    {
        Node current = head;

        while (current != null)
        {
            Console.WriteLine(current.value);
            current = current.next;
        }
    }
}
添加节点类。
然后添加LinkedList类以实现链接列表
添加一个测试类来执行链表

namespace LinkedListProject
{
    public class Node
    {
        public Node next;
        public object data;
    }

    public class MyLinkedList
    {
        Node head;
        public Node AddNodes(Object data)
        {
            Node node = new Node();

            if (node.next == null)
            {
                node.data = data;
                node.next = head;
                head = node;
            }
            else
            {
                while (node.next != null)
                    node = node.next;

                node.data = data;
                node.next = null;

            }
            return node;
        }

        public void printnodes()
        {
            Node current = head;
            while (current.next != null)
            {
                Console.WriteLine(current.data);
                current = current.next;
            }
            Console.WriteLine(current.data);
        }
    }


    [TestClass]
    public class LinkedListExample
    {
        MyLinkedList linkedlist = new MyLinkedList();
        [TestMethod]
        public void linkedlisttest()
        {
            linkedlist.AddNodes("hello");
            linkedlist.AddNodes("world");
            linkedlist.AddNodes("now");
            linkedlist.printnodes();
        }
    }
}

这是一个很好的实现

  • 它很短,但实现了Add(x)、Delete(x)、Contain(x)和Print()
  • 它避免了添加到空列表或删除第一个元素时的特殊过程。 而大多数其他示例在删除第一个元素时都进行了特殊处理
  • 列表可以包含任何数据类型

    using System;
    
    class Node<Type> : LinkedList<Type>
    {   // Why inherit from LinkedList? A: We need to use polymorphism.
        public Type value;
        public Node(Type value) { this.value = value; }
    }
    class LinkedList<Type>
    {   
        Node<Type> next;  // This member is treated as head in class LinkedList, but treated as next element in class Node.
        /// <summary> if x is in list, return previos pointer of x. (We can see any class variable as a pointer.)
        /// if not found, return the tail of the list. </summary>
        protected LinkedList<Type> Previos(Type x)
        {
            LinkedList<Type> p = this;      // point to head
            for (; p.next != null; p = p.next)
                if (p.next.value.Equals(x))
                    return p;               // find x, return the previos pointer.
            return p;                       // not found, p is the tail.
        }
        /// <summary> return value: true = success ; false = x not exist </summary>
        public bool Contain(Type x) { return Previos(x).next != null ? true : false; }
        /// <summary> return value: true = success ; false = fail to add. Because x already exist. 
        /// </summary> // why return value? If caller want to know the result, they don't need to call Contain(x) before, the action waste time.
        public bool Add(Type x)
        {
            LinkedList<Type> p = Previos(x);
            if (p.next != null)             // Find x already in list
                return false;
            p.next = new Node<Type>(x);
            return true;
        }
        /// <summary> return value: true = success ; false = x not exist </summary>
        public bool Delete(Type x)
        {
            LinkedList<Type> p = Previos(x);
            if (p.next == null)
                return false;
            //Node<Type> node = p.next;
            p.next = p.next.next;
            //node.Dispose();       // GC dispose automatically.
            return true;
        }
        public void Print()
        {
            Console.Write("List: ");
            for (Node<Type> node = next; node != null; node = node.next)
                Console.Write(node.value.ToString() + " ");
            Console.WriteLine();
        }
    }
    class Test
    {
        static void Main()
        {
            LinkedList<int> LL = new LinkedList<int>();
            if (!LL.Contain(0)) // Empty list
                Console.WriteLine("0 is not exist.");
            LL.Print();
            LL.Add(0);      // Add to empty list
            LL.Add(1); LL.Add(2); // attach to tail
            LL.Add(2);      // duplicate add, 2 is tail.
            if (LL.Contain(0))// Find existed element which is head
                Console.WriteLine("0 is exist.");
            LL.Print();
            LL.Delete(0);   // Delete head
            LL.Delete(2);   // Delete tail
            if (!LL.Delete(0)) // Delete non-exist element
                Console.WriteLine("0 is not exist.");
            LL.Print();
            Console.ReadLine();
        }
    }
    
    使用系统;
    类节点:LinkedList
    {//为什么从LinkedList继承?答:我们需要使用多态性。
    公共类型值;
    公共节点(类型值){this.value=value;}
    }
    类链接列表
    {   
    Node next;//此成员在类LinkedList中被视为头,但在类Node中被视为下一个元素。
    ///如果x在列表中,则返回previ
    
    class Program
    {
        static void Main(string[] args)
        {
            LinkedList linkedList = new LinkedList(1);
    
            linkedList.Add(2);
            linkedList.Add(3);
            linkedList.Add(4);
    
            linkedList.AddFirst(0);
    
            linkedList.Print();            
        }
    }
    
    public class Node
    {
        public Node(Node next, Object value)
        {
            this.next = next;
            this.value = value;
        }
    
        public Node next;
        public Object value;
    }
    
    public class LinkedList
    {
        public Node head;
    
        public LinkedList(Object initial)
        {
            head = new Node(null, initial);
        }
    
        public void AddFirst(Object value)
        {
            head = new Node(head, value);            
        }
    
        public void Add(Object value)
        {
            Node current = head;
    
            while (current.next != null)
            {
                current = current.next;
            }
    
            current.next = new Node(null, value);
        }
    
        public void Print()
        {
            Node current = head;
    
            while (current != null)
            {
                Console.WriteLine(current.value);
                current = current.next;
            }
        }
    }
    
    namespace LinkedListProject
    {
        public class Node
        {
            public Node next;
            public object data;
        }
    
        public class MyLinkedList
        {
            Node head;
            public Node AddNodes(Object data)
            {
                Node node = new Node();
    
                if (node.next == null)
                {
                    node.data = data;
                    node.next = head;
                    head = node;
                }
                else
                {
                    while (node.next != null)
                        node = node.next;
    
                    node.data = data;
                    node.next = null;
    
                }
                return node;
            }
    
            public void printnodes()
            {
                Node current = head;
                while (current.next != null)
                {
                    Console.WriteLine(current.data);
                    current = current.next;
                }
                Console.WriteLine(current.data);
            }
        }
    
    
        [TestClass]
        public class LinkedListExample
        {
            MyLinkedList linkedlist = new MyLinkedList();
            [TestMethod]
            public void linkedlisttest()
            {
                linkedlist.AddNodes("hello");
                linkedlist.AddNodes("world");
                linkedlist.AddNodes("now");
                linkedlist.printnodes();
            }
        }
    }
    
    using System;
    
    class Node<Type> : LinkedList<Type>
    {   // Why inherit from LinkedList? A: We need to use polymorphism.
        public Type value;
        public Node(Type value) { this.value = value; }
    }
    class LinkedList<Type>
    {   
        Node<Type> next;  // This member is treated as head in class LinkedList, but treated as next element in class Node.
        /// <summary> if x is in list, return previos pointer of x. (We can see any class variable as a pointer.)
        /// if not found, return the tail of the list. </summary>
        protected LinkedList<Type> Previos(Type x)
        {
            LinkedList<Type> p = this;      // point to head
            for (; p.next != null; p = p.next)
                if (p.next.value.Equals(x))
                    return p;               // find x, return the previos pointer.
            return p;                       // not found, p is the tail.
        }
        /// <summary> return value: true = success ; false = x not exist </summary>
        public bool Contain(Type x) { return Previos(x).next != null ? true : false; }
        /// <summary> return value: true = success ; false = fail to add. Because x already exist. 
        /// </summary> // why return value? If caller want to know the result, they don't need to call Contain(x) before, the action waste time.
        public bool Add(Type x)
        {
            LinkedList<Type> p = Previos(x);
            if (p.next != null)             // Find x already in list
                return false;
            p.next = new Node<Type>(x);
            return true;
        }
        /// <summary> return value: true = success ; false = x not exist </summary>
        public bool Delete(Type x)
        {
            LinkedList<Type> p = Previos(x);
            if (p.next == null)
                return false;
            //Node<Type> node = p.next;
            p.next = p.next.next;
            //node.Dispose();       // GC dispose automatically.
            return true;
        }
        public void Print()
        {
            Console.Write("List: ");
            for (Node<Type> node = next; node != null; node = node.next)
                Console.Write(node.value.ToString() + " ");
            Console.WriteLine();
        }
    }
    class Test
    {
        static void Main()
        {
            LinkedList<int> LL = new LinkedList<int>();
            if (!LL.Contain(0)) // Empty list
                Console.WriteLine("0 is not exist.");
            LL.Print();
            LL.Add(0);      // Add to empty list
            LL.Add(1); LL.Add(2); // attach to tail
            LL.Add(2);      // duplicate add, 2 is tail.
            if (LL.Contain(0))// Find existed element which is head
                Console.WriteLine("0 is exist.");
            LL.Print();
            LL.Delete(0);   // Delete head
            LL.Delete(2);   // Delete tail
            if (!LL.Delete(0)) // Delete non-exist element
                Console.WriteLine("0 is not exist.");
            LL.Print();
            Console.ReadLine();
        }
    }
    
       public class LinkedList<T> : IEnumerable
    {
        private Node<T> _head = null;
    
        public Node<T> Add(T value)
        {
            var node = new Node<T> {Value = value};
    
            if (_head == null)
            {
                _head = node;
            }
            else
            {
                var current = _head;
                while (current.Next != null)
                {
                    current = current.Next;
                }
                current.Next = node; //new head
            }
    
            return node;
        }
    
        public T Remove(Node<T> node)
        {
            if (_head == null)
                return node.Value;
    
            if (_head == node)
            {
                _head = _head.Next;
                node.Next = null;
                return node.Value;
            }
    
            var current = _head;
            while (current.Next != null)
            {
                if (current.Next == node)
                {
                    current.Next = node.Next;
                    return node.Value;
                }
    
                current = current.Next;
            }
    
            return node.Value;
        }
    
        public void Reverse()
        {
            Node<T> prev = null;
            var current = _head;
    
            if (current == null)
                return;
    
            while (current != null)
            {
                var next = current.Next;
                current.Next = prev;
                prev = current;
                current = next;
            }
    
            _head = prev;
        }
    
        public void ReverseRecurisve()
        {
            reverseRecurive(_head, null);
        }
    
        private void reverseRecurive(Node<T> current, Node<T> prev)
        {
            if (current.Next == null)
            {
                _head = current;
                _head.Next = prev;
                return;
            }
    
            var next = current.Next;
            current.Next = prev;
            reverseRecurive(next, current);
        }
    
        public IEnumerator<T> Enumerator()
        {
            var current = _head;
            while (current != null)
            {
                yield return current.Value;
                current = current.Next;
            }
        }
    
        public IEnumerator GetEnumerator()
        {
            return Enumerator();
        }
    }
    
    public class Node<T>
    {
        public T Value { get; set; }
        public Node<T> Next { get; set; }
    }
    
     using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
    
        namespace SingleLinkedList
        {
            class Program
            {
                Node head;
                Node current;
                int counter = 0;
                public Program()
                {
                    head = new Node();
                    current = head;
                }
                public void AddStart(object data)
                {
                    Node newnode = new Node();
                    newnode.next = head.next;
                    newnode.data = data;
                    head.next = newnode;
                    counter++;
                }
                public void AddEnd(object data)
                {
                    Node newnode = new Node();
                    newnode.data = data;
                    current.next = newnode;
                    current = newnode;
                    counter++;
                }
                public void RemoveStart()
                {
                    if (counter > 0)
                    {
                        head.next = head.next.next;
                        counter--;
                    }
                    else
                    {
                        Console.WriteLine("No element exist in this linked list.");
                    }
                }
                public void RemoveEnd()
                {
                    if (counter > 0)
                    {
                        Node prevNode = new Node();
                        Node cur = head;
                        while (cur.next != null)
                        {
                            prevNode = cur;
                            cur = cur.next;
                        }
                        prevNode.next = null;
                    }
                    else
                    {
                        Console.WriteLine("No element exist in this linked list.");
                    }
                }
                public void Display()
                {
                    Console.Write("Head ->");
                    Node curr = head;
                    while (curr.next != null)
                    {
                        curr = curr.next;
                        Console.WriteLine(curr.data.ToString());
                    }
                }
                public class Node
                {
                    public object data;
                    public Node next;
                }
                static void Main(string[] args)
                {
                    Program p = new Program();
                    p.AddEnd(2);
                    p.AddStart(1);
                    p.AddStart(0);
                    p.AddEnd(3);
                    p.Display();
                    p.RemoveStart();
                    Console.WriteLine("Removed node from Start");
                    p.Display();
                    Console.WriteLine("Removed node from End");
                    p.RemoveEnd();
                    p.Display();
                    Console.ReadKey();
                }
            }
        }
    
    void Main()
    {
        var b = new Bag<string>();
        b.Add("bike");
        b.Add("erasmus");
        b.Add("kumquat");
        b.Add("beaver");
        b.Add("racecar");
        b.Add("barnacle");
    
        foreach (var thing in b)
        {
            Console.WriteLine(thing);
        }
    }
    
    // Define other methods and classes here
    
    public class Bag<T> : IEnumerable<T>
    {
        public Node<T> first;// first node in list
    
        public class Node<T>
        {
            public T item;
            public Node<T> next;
    
            public Node(T item)
            {
                this.item = item;
            }
        }
    
    
        public void Add(T item)
        {
            Node<T> oldFirst = first;
            first = new Node<T>(item);
            first.next = oldFirst;
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    
        public IEnumerator<T> GetEnumerator()
        {
            return new BagEnumerator<T>(this);
        }
    
        public class BagEnumerator<V> : IEnumerator<T>
        {
            private Node<T> _head;
            private Bag<T> _bag;
            private Node<T> _curNode;
    
    
            public BagEnumerator(Bag<T> bag)
            {
    
                _bag = bag;
                _head = bag.first;
                _curNode = default(Node<T>);
    
            }
    
            public T Current
            {
                get { return _curNode.item; }
            }
    
    
            object IEnumerator.Current
            {
                get { return Current; }
            }
    
            public bool MoveNext()
            {
                if (_curNode == null)
                {
                    _curNode = _head;
                    if (_curNode == null)
                    return false;
                    return true;
                }
                if (_curNode.next == null)
                return false;
                else
                {
                    _curNode = _curNode.next;
                    return true;
                }
    
            }
    
            public void Reset()
            {
                _curNode = default(Node<T>); ;
            }
    
    
            public void Dispose()
            {
            }
        }
    }
    
    var tune = new LinkedList<string>();
    tune.AddFirst ("do"); // do
    tune.AddLast ("so"); // do - so
    tune.AddAfter (tune.First, "re"); // do - re- so
    tune.AddAfter (tune.First.Next, "mi"); // do - re - mi- so
    tune.AddBefore (tune.Last, "fa"); // do - re - mi - fa- so
    tune.RemoveFirst(); // re - mi - fa - so
    tune.RemoveLast(); // re - mi - fa
    LinkedListNode<string> miNode = tune.Find ("mi");
    tune.Remove (miNode); // re - fa
    tune.AddFirst (miNode); // mi- re - fa
    foreach (string s in tune) Console.WriteLine (s);
    
    using System;
    using System.Collections.Generic;
    
    namespace Codebase
    {
        public class Node
        {
            public object Data { get; set; }
            public Node Next { get; set; }
    
            public Node()
            {
            }
    
            public Node(object Data, Node Next = null)
            {
                this.Data = Data;
                this.Next = Next;
            }
        }
    
        public class LinkedList
        {
            private Node Head;
            public Node First
            {
                get => Head;
                set
                {
                    First.Data = value.Data;
                    First.Next = value.Next;
                }
            }
    
            public Node Last
            {
                get
                {
                    Node p = Head;
                    //Based partially on https://en.wikipedia.org/wiki/Linked_list
                    while (p.Next != null)
                        p = p.Next; //traverse the list until p is the last node.The last node always points to NULL.
    
                    return p;
                }
                set
                {
                    Last.Data = value.Data;
                    Last.Next = value.Next;
                }
            }
    
            public void AddFirst(Object data, bool verbose = true)
            {
                Head = new Node(data, Head);
                if (verbose) Print();
            }
    
            public void AddFirst(Node node, bool verbose = true)
            {
                node.Next = Head;
                Head = node;
                if (verbose) Print();
            }
    
            public void AddLast(Object data, bool Verbose = true)
            {
                Last.Next = new Node(data);
                if (Verbose) Print();
            }
    
            public Node RemoveFirst(bool verbose = true)
            {
                Node temp = First;
                Head = First.Next;
                if (verbose) Print();
                return temp;
            }
    
            public Node RemoveLast(bool verbose = true)
            {
                Node p = Head;
                Node temp = Last;
    
                while (p.Next != temp)
                    p = p.Next;
    
                p.Next = null;
                if (verbose) Print();
    
                return temp;
            }
    
            public void AddAfter(Node node, object data, bool verbose = true)
            {
                Node temp = new Node(data);
                temp.Next = node.Next;
                node.Next = temp;
    
                if (verbose) Print();
            }
    
            public void AddBefore(Node node, object data, bool verbose = true)
            {
                Node temp = new Node(data);
    
                Node p = Head;
    
                while (p.Next != node) //Finding the node before
                {
                    p = p.Next;
                }
    
                temp.Next = p.Next; //same as  = node
                p.Next = temp;
    
                if (verbose) Print();
            }
    
            public Node Find(object data)
            {
                Node p = Head;
    
                while (p != null)
                {
                    if (p.Data == data)
                        return p;
    
                    p = p.Next;
                }
                return null;
            }
    
            public void Remove(Node node, bool verbose = true)
            {
                Node p = Head;
    
                while (p.Next != node)
                {
                    p = p.Next;
                }
    
                p.Next = node.Next;
                if (verbose) Print();
            }
    
            public void Print()
            {
                Node p = Head;
                while (p != null) //LinkedList iterator
                {
                    Console.Write(p.Data + " ");
                    p = p.Next; //traverse the list until p is the last node.The last node always points to NULL.
                }
                Console.WriteLine();
            }
        }
    }
    
    using System;
    using System.Collections.Generic;
    using Codebase;
    
    namespace Cmd
    {
        static class Program
        {
            static void Main(string[] args)
            {
                var tune = new LinkedList(); //Using custom code instead of the built-in LinkedList<T>
                tune.AddFirst("do"); // do
                tune.AddLast("so"); // do - so
                tune.AddAfter(tune.First, "re"); // do - re- so
                tune.AddAfter(tune.First.Next, "mi"); // do - re - mi- so
                tune.AddBefore(tune.Last, "fa"); // do - re - mi - fa- so
                tune.RemoveFirst(); // re - mi - fa - so
                tune.RemoveLast(); // re - mi - fa
                Node miNode = tune.Find("mi"); //Using custom code instead of the built in LinkedListNode
                tune.Remove(miNode); // re - fa
                tune.AddFirst(miNode); // mi- re - fa
     }
    }
    
    package info.algonuts;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    
    class LLNode {
        int nodeValue;
        LLNode childNode;
    
        public LLNode(int nodeValue) {
            this.nodeValue = nodeValue;
            this.childNode = null;
        }
    }
    
    class LLCompute {
        private static LLNode temp;
        private static LLNode previousNode;
        private static LLNode newNode;
        private static LLNode headNode;
    
        public static void add(int nodeValue) {
            newNode = new LLNode(nodeValue);
            temp = headNode;
            previousNode = temp;
            if(temp != null)
            {   compute();  }
            else
            {   headNode = newNode; }   //Set headNode
        }
    
        private static void compute() {
            if(newNode.nodeValue < temp.nodeValue) {    //Sorting - Ascending Order
                newNode.childNode = temp;
                if(temp == headNode) 
                {   headNode = newNode; }
                else if(previousNode != null) 
                {   previousNode.childNode = newNode;   }
            }
            else
            {
                if(temp.childNode == null)
                {   temp.childNode = newNode;   }
                else
                {
                    previousNode = temp;
                    temp = temp.childNode;
                    compute();
                }
            }
        }
    
        public static void display() {
            temp = headNode;
            while(temp != null) {
                System.out.print(temp.nodeValue+" ");
                temp = temp.childNode;
            }
        }
    }
    
    public class LinkedList {
        //Entry Point
        public static void main(String[] args) {
            //First Set Input Values
            List <Integer> firstIntList = new ArrayList <Integer>(Arrays.asList(50,20,59,78,90,3,20,40,98));   
            Iterator<Integer> ptr  = firstIntList.iterator();
            while(ptr.hasNext()) 
            {   LLCompute.add(ptr.next());  }
            System.out.println("Sort with first Set Values");
            LLCompute.display();
            System.out.println("\n");
    
            //Second Set Input Values
            List <Integer> secondIntList = new ArrayList <Integer>(Arrays.asList(1,5,8,100,91));   
            ptr  = secondIntList.iterator();
            while(ptr.hasNext()) 
            {   LLCompute.add(ptr.next());  }
            System.out.println("Sort with first & Second Set Values");
            LLCompute.display();
            System.out.println();
        }
    }