繁体   English   中英

通过递归反转单个链表

[英]reversing a singly linked list by recursion

这是用于通过递归逆转单个链表的代码:

public static LinkedListNode reverse_recursive(
      LinkedListNode head) {

    if (head == null || 
        head.next == null) {
        return head;
    }

    LinkedListNode reversed_list = 
      reverse_recursive(head.next);

    head.next.next = head;
    head.next = null;
    return reversed_list;
  }

我知道递归不是解决此问题的最佳方法,但我无法弄清楚代码“ head.next.next = head”在做什么。 我很困惑,请帮助我清除思路。 谢谢!

head --> A
         .next --> B
                   .next --> C

因此,在上面的示例中, head.next引用了节点B, head.next.next引用了节点C。

head.next.next = something

因此等于

nodeB.next = something

在您的代码中, somethinghead 并且head引用节点A。因此,它为节点B的下一个节点分配了一个新值,如果节点A:

head --> A <---------------
         .next --> B      |
                   .next --

以下说明是

head.next = null, which thus leads to

head --> A <---------------
                   B      |
                   .next --
head.next.next = head 

正在将当前节点(头)分配为递归上次访问的节点的链接。

递归将从列表中的最后一个节点开始,并在第一个节点上结束。

假设您有链表A --> B --> C --> D --> NULL

它将开始从node D反转上述列表,并且由于节点D的nextnull ,因此递归将立即移至下一个节点,即node C

将会发生的事情是它将占据先机(现在是node C ),并将其分配为node Dnext

直到没有更多的节点可以遍历为止

在此处输入图片说明

public static LinkedListNode reverse_recursive(LinkedListNode head) {
if (head == null || head.next == null) {
    return head;
}

如果该节点(在我们的例子中为头)等于null,或者下一个节点等于null(意味着只有一个节点),则返回该节点,因为您不能反转空引用或仅包含一个节点的列表(基本上已经被撤销了)。 这是递归解决方案的基本情况。

LinkedListNode reversed_list = reverse_recursive(head.next);

我们将下一个节点发送到递归函数中,例如,如果列表中有三个节点1-> 2-> 3,则将第二个节点发送到reverse_recursive函数中。 该函数将返回3-> 2,并且reversed_list将指向节点3。现在,我们需要将节点1连接到反向列表3-> 2。

head.next.next = head;

head.next(节点2)将指向(head.next.next)节点1(头)。

head.next = null;

由于节点1是最后一个节点,因此应指向null,这意味着不再有节点。

return reversed_list;

现在我们只需要返回正确的引用(反向列表的第一个节点)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM