将节点添加到链接列表

时间:2014-01-14 21:14:44

标签: c#

我想实现简单的链接列表并添加项目,似乎我的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();

    }

4 个答案:

答案 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++;
}

每次尝试添加节点时,都不必遍历节点。