java - 反转链表

标签 java recursion linked-list reverse

我正在编写一个简单的递归代码来反转 Java 中的链表。奇怪的是它返回相同的节点。

Node reverse(Node ptr) {
    if (ptr.link == null)
        return ptr;

    Node second = ptr.link;
    ptr.link = null;

    Node rest = reverse(second);
    rest.link = ptr;

    return rest;
}

为什么这不起作用?

最佳答案

您当前的方法不起作用,从递归调用返回的 rest 值不会指向列表中的 last 元素(应该是节点的插入点),而是指向结果的第一个元素。换句话说,这一行没有正确构建输出:

rest.link = ptr;

为了成功反转列表,一种策略是使用累加器参数,因此我们可以在递归展开时在列表的头部插入 - 请记住,递归开始以相反的顺序“返回”到列表中的元素。试试这个,它是 tail-recursive解决办法:

Node reverse(Node ptr, Node acc) {
    if (ptr == null)
        return acc;
    Node second = ptr.link;
    ptr.link = acc;
    return reverse(second, ptr);
}

像这样调用上面的方法:

Node reversedList = reverse(list, null);

请注意,输入列表就地修改,并且在方法返回后不会相同,任何保存对的引用的变量>list 将受到影响。如果这是一个问题,您应该先创建一个 list 的副本,然后再将其传递给 reverse()

关于java - 反转链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24467439/

相关文章:

c++ - 正确管理内存——创建包含指针的双向链表

c - 从文件中读取数据并将其写入链表

java - Java 中的素数 - 算法

java - session bean 属于应用程序吗?

java - 仅通过一个对象时计算字符串的长度?

c - 递归到底是什么并解释一下这个程序的输出?

algorithm - 将排序链表转换为平衡二叉树未正确返回?

java - 使用 Swing 让用户等待

python - 从嵌套字典创建 tkinter 嵌套 TreeView

haskell - 从列表中删除所有实例