我正在创建自己的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;
}
}
答案 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个问题
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);
对于未实现!=运算符的引用类型也是如此。所以字符串将起作用,但其他很少