假设我们有
ListNode {
ListNode next;
int number;
//gets sets
}
是否可以使用循环中只有一个字符串的循环来反转列表?
这样的事情:
for(...) {
// only one string of code (one statement)
}
一个人告诉我这是可能的,但我不明白怎么做。 你可以帮忙吗?谢谢!
答案 0 :(得分:3)
是。有可能的。它不漂亮。
首先,ListNode的toString方法验证答案。您可以打印root
和reverse(root)
以查看结果是否有效。
public String toString() {
if (next != null) {
return "" + num + " " + next.toString();
}
return "" + num;
}
零线应答,反转到位:
static ListNode reverse(ListNode node) {
ListNode headNode = null;
ListNode previousNode = null;
for (; node != null; previousNode = headNode, headNode = node, node = node.next, headNode.next = previousNode)
;
return headNode;
}
基本上,很多节点子交换。我们跟踪前一个节点,以便将它们附加到头节点,但我们还必须跟踪下一个节点进行迭代。
现在,代码高尔夫反向方法以相反的顺序返回一组新的节点。
static ListNode reverse(ListNode node) {
ListNode headNode = null;
ListNode followerNode = null;
for (; node != null; node = node.next, followerNode = headNode) {
(headNode = new ListNode(node.num)).next = followerNode;
}
return headNode;
}
基本上,这些方法滥用了很多关于Java的东西,你真的不应该这样做。我们通过不使用任何整数进行迭代来滥用for循环。然后我们通过包含两行代码来滥用增量部分。
然后,奇异的代码行将headNode
设置为值的新ListNode
,然后将其next
设置为上一个headNode
。
实际上,正确编写它所需的工作量要少于编写保存线条的东西。
我的意思是,从技术上讲,如果你真的想要,你可以将所有内容放入for循环迭代器部分并且不得行,但是本着试图实际遵循提示的精神,只有真正的赋值放在for中循环。
话虽这么说,但是习惯性的编码约定我们不要将代码填入for循环执行以节省几行。在这个时代,唯一真正的目的是缩短代码高尔夫中的间距。
PS:将来,如果有人告诉你某些东西可以用Java,你应该让他们解释一下。 Java中是否有可能是我们是否应该用Java做的超集。