迭代深度复制链接列表

时间:2012-11-06 06:54:07

标签: java linked-list deep-copy iteration

这是一项家庭作业。将以下递归深层复制方法更改为迭代等效方法。我走近了,需要你的帮助才能做到。 递归实现:

public static StringNode copy(StringNode str) {
        if (str == null)
            return null;

        StringNode copyFirst = new StringNode(str.ch, null);
        copyFirst.next = copy(str.next);
        return copyFirst;
    }

这是我提出的,迭代的等价物。已经实现了static length()方法,以返回给定链接列表中有多少个节点。

public static StringNode copy(StringNode str) {
    if (str == null)
        return null;

    StringNode firstNode = new StringNode(str.ch ,null);
    StringNode prevNode = firstNode;
    StringNode nextNode;

    for (int i = 1; i < length(str); i++) {
        nextNode = new StringNode(str.next.ch, null);
        prevNode.next = nextNode;
        prevNode = nextNode;
    }

    return firstNode;
}

问题:为了测试我的实现,我创建了一个包含字符值str1的链接列表'n', 'b', 'a',然后调用

StringNode copy = StringNode.copy(str1);

然后我删除str1的最后一个节点,将其保留为'n','b', 但是,当我尝试打印出副本中存储的内容时,我明白了 'n', 'b', 'b'代替'n', 'b', 'a'

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您还需要在循环中向前移动str,否则您将在每次迭代中不断在same str中添加list。第一个元素在第一次调用方法时是不同的。然后str.next在你的循环中是相同的。

因此,您需要在for循环中添加此代码: -

str = str.next;

另外,你的循环有一些问题。你不应该迭代到length(str)。但直到str == null

所以,最后你的循环应该是这样的: -

while (str.next != null) {  // Iterate till str.next != null, as we are creating 
                            // the next node in the loop for current node str

    nextNode = new StringNode(str.next.ch, null);
    prevNode.next = nextNode;
    prevNode = nextNode;

    str = str.next;  // Move to next node.
}

在这种情况下必须使用while循环,因为您不知道循环应迭代多少次。