我想实现简单的链接列表并添加项目,似乎我的Add
函数进入无限循环,我不知道为什么
public class IntNode
{
private int _value;
private IntNode _next;
public IntNode(int val, IntNode n)
{
_value = val;
_next = n;
}
public int getValue()
{
return _value;
}
public IntNode getNext()
{
return _next;
}
public void setValue(int v)
{
_value = v;
}
public void setNext(IntNode next)
{
_next = next;
}
public string ToString()
{
return _value.ToString();
}
}
public class IntList
{
private IntNode _head;
public static int count;
public IntList()
{
_head = null;
count = 0;
}
public IntList(IntNode node)
{
_head = node;
}
public void Add(IntNode node)
{
if (_head == null)
_head = node;
else
{
for (IntNode p = _head; p.getNext() != null; p.getNext()) { }
_head.setNext(node);
count++;
}
}
public void ToString()
{
IntNode cur = _head;
while (cur.getNext() != null)
{
Console.WriteLine(cur.ToString());
cur = cur.getNext();
}
}
}
主
static void Main(string[] args)
{
IntList list = new IntList();
list.Add(new IntNode(5, null));
list.Add(new IntNode(2, null));
list.Add(new IntNode(8, null));
list.Add(new IntNode(1, null));
list.ToString();
}
答案 0 :(得分:3)
问题是for
循环中的增量步骤。它必须p = p.getNext()
而不仅仅是p.getNext()
。后者只调用getNext
函数并且对返回没有任何作用,这意味着p
永远不会被修改,因此循环不会取得任何进展
for (IntNode p = _head; p.getNext() != null; p = p.getNext()) { }
下一个问题是您实际上没有移动_head
或使用p
值。因此,您实际上没有找到要插入的位置。您需要的是以下内容
IntNode p = _head;
while (p.getNext() != null) {
p = p.getNext();
}
p.setNext(node);
答案 1 :(得分:1)
for (IntNode p = _head; p.getNext() != null; p.getNext()) { }
你没有在任何地方使用p
,也没有在循环体中做任何事情。你能发现你的问题吗?
答案 2 :(得分:0)
首先,您不会将getNext()
的结果分配到任何地方:
for (IntNode p = _head; p.getNext() != null; p.getNext()) { }
其次,你甚至不在任何地方使用最后一个节点。事实上,你甚至不能,因为p
循环之外不存在for
......
建议:同时保留对 last 节点的引用,让您的生活更简单。
答案 3 :(得分:0)
你的循环永远不会结束,因为p
没有增加。
如果您保留对最后插入项目的引用,则应该更容易。例如:
private IntNode _lastNode;
public void Add(IntNode node)
{
if (_head == null)
_head = node;
else
{
if (_lastNode == null)
_lastNode = _head;
_lastNode.setNext(node)
_lastNode = node;
}
count++;
}
每次尝试添加节点时,都不必遍历节点。