创建自定义LinkedList

时间:2010-10-05 20:29:18

标签: c#

我正在创建自己的LinkedList。但我似乎无法解决这个错误。任何人都可以帮助我!

问题是我想在特定元素之后插入一个对象。我创建了Find方法来搜索该特定项并返回其引用,但我似乎无法解决它。

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;
    }
}

3 个答案:

答案 0 :(得分:3)

它不起作用的原因在于这一行:

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

==类型的!=object运算符检查引用相等。如果您在列表中使用值类型(例如int),则值将被设置为不同的对象,!=运算符将始终返回true(请参阅this article关于拳击的详细信息。

考虑一下:

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

您当前的代码在引用类型上运行良好:

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

输出:

  

您好
  世界
  !

但对于值类型,它永远不会找到“after”值,因此它会将新项目附加到列表的末尾:

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

输出:

  

1
  3
  2

因此,您需要通过调用==来替换Equals运算符:

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

答案 1 :(得分:1)

您的代码有2个问题

  • 当Item不在List中时,Find()函数返回Tail元素。
  • n.Element类型为Item时,比较object 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; } } 会非常棘手。让你的类通用来解决这个问题。

...

{{1}}

答案 2 :(得分:1)

我不知道你用于测试的是什么,但是值类型不会按照你认为的方式工作,因为正在比较盒子值。

例如,这将始终返回3(列表中的最后一个元素)

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

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

但这将起作用(输出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);

对于未实现!=运算符的引用类型也是如此。所以字符串将起作用,但其他很少