【问题标题】:linked list get retrieveAt method链表获取retrieveAt方法
【发布时间】:2014-12-12 19:02:04
【问题描述】:

我有以下家庭作业:

为类IntSLList添加一个新方法retrieveAt,它将整数索引位置作为参数。

该方法返回索引位置处节点内的信息。第一个节点的索引为0。如果列表为空或索引无效,则显示错误信息。

我已经使用以下代码实现了一个解决方案:

public int retrieveAt(int pos){
    IntSLLNode tmp;
    int count = 0;
    int c;
    for(tmp = head; tmp != null; tmp = tmp.next){
        count++;
    }
    if(isEmpty()|| count<pos){
        return 0; 
    } else {
        IntSLLNode tmp1 = head;
        for(int i = 1; i < pos; i++){
            if(tmp1.next == null)
                return 0;
            tmp1 = tmp1.next;
        }
        return tmp1.info;
    }
}

它似乎正确地遍历了列表,但它没有检索到正确的元素。

这似乎没有给出正确输出的示例:

IntSLList myn = new IntSLList();

myn.addToHead(10);
myn.addToHead(20);
myn.addToHead(30);
myn.addToHead(40);
myn.addToTail(60);
myn.printAll();

int x = myn.retrieveAt(4);
if(x == 0)
    System.out.println("NOT VALID ");
else
    System.out.println("elm : " + x);

输出是:

40 
30 
20 
10 
60 
elm : 10

【问题讨论】:

  • 请在第二个 for 循环中设置 i=0 而不是 i=1。

标签: java


【解决方案1】:
int x=myn.retrieveAt(4);

你得到了第四个元素,因为你使用了神奇的数字 4。我建议使用 myn 中的元素数量,或者找出在 IntSLList 类的实现中是否有更简单的方法来执行此操作。

【讨论】:

  • 在链表中我们从 1 开始计数 ??我以为它就像数组
  • 如果你在for (int i = 1; i &lt; pos; i++)从0而不是1开始,那么列表迭代从0开始,是的。
  • 所以解决方案是让 i=0 像 Mr37037 指出的那样,也不要使用神奇的 4,以防下次你有更多或更少的元素。
【解决方案2】:

我不确定 addToHead 应该做什么(在开头或结尾添加)。 我创建了这个兼具两者的小示例类,请选择适合您术语的方法。

这个例子并不完整,没有错误检查等。 我试图阅读您的代码,并觉得 for 循环非常混乱。 也许这也是让你感到困惑的地方?这就是我制作这个示例的原因,它让您进入每个节点的位置,以找出下一步该做什么并递归工作。

添加元素涉及的基本操作有: 我知道下一个节点吗? (这是链条的末端吗?) 我应该将自己的值传递给下一个节点还是传递给我的值? (应该在哪里添加新值?结束还是开始?)

public class Node
{
    private Node next;
    private Integer value;

    public Node()
    {
    }

    public void push(Integer value)
    {
        if(next != null)
            next.push(value);
        else
        {
            next = new Node();
            this.value = value;
        }
    }

    public void unshift (Integer value)
    {
        if(next != null)
        {
            next.unshift(this.value);
        }
        else
        {
            next = new Node();
            next.value = this.value;
        }
        this.value = value;
    }

    public Integer get(int index)
    {
        if(index > 0)
            return next.get(--index);
        else
            return value;
    }


    public int length()
    {
        if(next == null)
            return 0;
        else
            return next.length() + 1;
    }

    public static void main(String[] args)
    {
        Node pushedList = new Node();

        pushedList.push(10);
        pushedList.push(20);
        pushedList.push(30);
        pushedList.push(40);

        for(int i = 0; i < pushedList.length(); ++i)
        {
            System.out.println("pushed element #" + i +": " + pushedList.get(i));
        }

        Node unshiftedList = new Node();

        unshiftedList.unshift(10);
        unshiftedList.unshift(20);
        unshiftedList.unshift(30);
        unshiftedList.unshift(40);

        for(int i = 0; i < unshiftedList.length(); ++i)
        {
            System.out.println("unshifted element #" + i +": " + unshiftedList.get(i));
        }

        Node mixedList = new Node();

        mixedList.unshift(10);
        mixedList.push(20);
        mixedList.unshift(30);
        mixedList.push(40);

        for(int i = 0; i < mixedList.length(); ++i)
        {
            System.out.println("mixed element #" + i +": " + mixedList.get(i));
        }
    }
}

编辑:这是我收到的输出:

pushed element #0: 10
pushed element #1: 20
pushed element #2: 30
pushed element #3: 40
unshifted element #0: 40
unshifted element #1: 30
unshifted element #2: 20
unshifted element #3: 10
mixed element #0: 30
mixed element #1: 10
mixed element #2: 20
mixed element #3: 40

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多