这是一项家庭作业。将以下递归深层复制方法更改为迭代等效方法。我走近了,需要你的帮助才能做到。 递归实现:
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'
。
有什么建议吗?
答案 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循环,因为您不知道循环应迭代多少次。