我成功地能够以非破坏性方式从链接列表中删除所有其他元素(通过返回新的链接列表)。这是函数:
public static Link<Integer> everyOther(Link<Integer> link){
if(link == null) return null;
if(link.next == null) return link;
return new Link(link.data, everyOther(link.next.next));
}
对于1,2,3,4的输入列表,它成功返回1,3。
但是我现在正试图破坏性地做这个(使用void返回类型)并且我遇到了麻烦。这是我到目前为止的尝试:
public static void everyOtherDestructive(Link<Integer> link){
if(link == null) return;
if(link.next == null) return;
if(link.next.next != null){
link.next = link.next.next;
everyOtherDestructive(link.next);
}
}
这仅适用于奇数长度但不均匀的列表。链接列表1,2,3,4应该更改为1,3但是我得到1,3,4。
任何人都可以帮助我理解为什么它不会像它应该跳过最后一个元素吗?
答案 0 :(得分:3)
这是因为,当你在3
时,你什么都不做(因为link.next.next
是null
)。
此时,您应将link.next
设置为null
。当你摆脱整个if语句时,这是自动实现的。
public static void everyOtherDestructive(Link<Integer> link){
if(link == null) return;
if(link.next == null) return;
link.next = link.next.next;
everyOtherDestructive(link.next);
}
答案 1 :(得分:3)
您的代码中存在错误
在你连接第一个和第三个之后,你去第三个并尝试获得堡垒和第五个,因为第五个是空的,你不能得到它,但是可以将第三个设置为null,所以你的最后一个如果应删除,一切都会好的。
public static void everyOtherDestructive(Link<Integer> link){
if(link == null) return;
if(link.next == null) return;
link.next = link.next.next;
everyOtherDestructive(link.next);
}
答案 2 :(得分:3)
不需要此if(link.next.next != null)
条件。它会跳过偶数列表中的最后一个元素。将其更改为:
public void everyOtherDestructive(Link<Integer> link) {
if (link == null || link.next == null)
return;
else {
link.next = link.next.next;
everyOtherDestructive(link.next);
}
}