开发者

Creating custom LinkedList

I am working on creating my own LinkedList. But I can't seem to solve this error. Can anyone help me!

The problem is that I want to insert an object after a particular element. I have created Find method to search for that particular item and return its reference, but I can't seem to solve it.

CustomLinkedList c = new CustomLinkedList();
        c.Add(31);

        c.Add(45);

        c.Add(23);

        c.Add(36);

        c.PrintList();

        Console.WriteLine("\n" + " Process of adding item at a spectifed location");
        c.Addafter(66,23);

开发者_运维问答
        c.PrintList();

class Node
{

    public object Element;
    public Node Link;

    public Node()
    {
        Element = null;
        Link = null;
    }

    public Node(object TheElement)
    {
        Element = TheElement;
        Link = null;
    }

class CustomLinkedList
{
    protected Node header;
    protected Node last;

    public CustomLinkedList()
    {
        //header = new Node("header");
    }

    private Node Find(object Item)
    {
        Node Current = new Node();
        Current = header;
        while (Current.Element != Item && Current.Link !=null)
        {
            Current = Current.Link;
        }
        return Current;
    }


    public void PrintList()
    {            
        Node n = new Node();
        n = header;
        while (n != null)
        {
            Console.WriteLine(n.Element);
            n = n.Link;
        }
    }

    public void Add(object a)
    {
        Node n = new Node();
        n.Element = a;
        n.Link = null;
        if (last == null)
        {
            header = n;
            last = n;
        }
        else
        {
            last.Link = n;
            last = n;
        }
    }

    public void Addafter(object newitem, object After)
    {
        Node current = new Node();
        Node newNode = new Node(newitem);
        current = Find(After);

        newNode.Link = current.Link;
        current.Link = newNode;
    }
}


The reason why it doesn't work is on this line:

while (Current.Element != Item && Current.Link !=null)

The == and != operators for the object type check for reference equality. If you're using your list with a value type (int for instance), the values will be boxed to distinct objects, and the != operator will always return true (see this article for details about boxing).

Consider this:

object x = 42;
object y = 42;
Console.WriteLine(x == y); // prints False
Console.WriteLine(x.Equals(y)); // prints True

Your current code is working fine with reference types:

var list = new CustomLinkedList();
list.Add("hello");
list.Add("!");
list.Addafter("world", "hello");
list.PrintList();

Output:

hello
world
!

But for value types it never finds the "after" value, so it appends the new item to the end of the list:

var list = new CustomLinkedList();
list.Add(1);
list.Add(3);
list.Addafter(2, 1);
list.PrintList();

Output:

1
3
2

So you need to replace the == operator with a call to Equals:

while (!object.Equals(Current.Element, Item) && Current.Link !=null)


I don't know what you're using for testing but value types won't work the way you think it should because the box values are being compared.

For example this will always return 3 (last element in list)

CustomLinkedList cList= new CustomLinkedList();
cList.Add(1);
cList.Add(2);
cList.Add(3);

Console.WriteLine(cList.Find(2).Element);

but this will work (output 2)

CustomLinkedList cll = new CustomLinkedList();
object a = 1;
object b = 2;
object c = 3;
cll.Add(a);
cll.Add(b);
cll.Add(c);

Console.WriteLine(cll.Find(b).Element);

The same goes for reference types that don't implement the != operators. So strings will work but little else will


Your code has 2 problems

  • The Find() function is returning the Tail element when the Item is not in the List.
  • Comparing n.Element and Item is tricky when they are of type object. Make your classes generic to solve that.

...

  class CustomLinkedList<T> where T : IEquatable
  {
    ....

    private Node Find(object Item)
    {
        Node Current = header;  // null for empty list

        //while (Current.Element != Item && Current.Link !=null)
        while(Current != null)
        {
            if (Current.Equals(Item) )  // can't always use ==
               break;
            Current = Current.Link;
        }
        return Current;
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜