是否可以在循环中使用单个语句反转链接列表?

时间:2014-12-01 17:17:03

标签: java data-structures

假设我们有

ListNode {
     ListNode next;
     int number;

     //gets sets
}

是否可以使用循环中只有一个字符串的循环来反转列表?

这样的事情:

for(...) {
// only one string of code (one statement)
}

一个人告诉我这是可能的,但我不明白怎么做。 你可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:3)

是。有可能的。它不漂亮。

首先,ListNode的toString方法验证答案。您可以打印rootreverse(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做的超集。