【问题标题】:How to understand head->next->next = head; for reverse single list by Recursion?如何理解 head->next->next = head;递归反向单列表?
【发布时间】:2016-06-16 00:56:53
【问题描述】:

一个符号链接列表,我想通过递归来修改它。但我不明白这行head->next->next = head;的含义。

为什么需要head->next->next

struct Node{
    int data;
    Node* next;
};

这里是实现代码:

Node* reverseByRecursion(Node *head)
{

    if(head == NULL || head->next == NULL) 
        return head;

    Node *newHead = reverseByRecursion(head->next);

    head->next->next = head;
    head->next = NULL;

    return newHead;    
}

【问题讨论】:

  • 我和你在一起,我也不明白(撇开中国的cmets),那个代码看起来很傻。
  • C 和 C++ 是不同的语言。不要用 C++ 编写这样的代码,使用类(最好是标准库)。为您的问题选择一种语言!或者那个代码是你的,在这种情况下你应该知道你在做什么。或者它不是你的。然后请你复制它的人解释一下。从某些网站复制代码总是一个坏主意。
  • 如果没有更多信息(环形列表/终止),这可能会引发未定义的行为。一般来说,列表不太适合递归。更好地使用迭代。
  • @πάνταῥεῖ 你在说什么?我不明白你。
  • @BlackMamba 所以我们误解了。

标签: algorithm recursion linked-list


【解决方案1】:

让我处理这个列表。

  1. reverseByRecursion(node1) 被调用。
  2. node1node1->next 都不是 NULL,因此调用了 newHead = reverseByRecursion(head2);
  3. node2node2->next 都不是 NULL,因此调用了 newHead = reverseByRecursion(head3);
  4. head3->nextNULL,所以head3 是从reverseByRecursion(head2) 返回的。
  5. head = node2head->next = node3,所以 head->next->next = head; 会将 node3->next 设置为 node2
  6. head->next = NULL; 会将 node2->next 设置为 NULL。 (图 2)
  7. newHead,即node3,是从reverseByRecursion(head2)返回的。
  8. head = node1head->next = node2,所以 head->next->next = head; 会将 node2->next 设置为 node1
  9. head->next = NULL; 会将 node1->next 设置为 NULL。 (图 3)
  10. newHead,即node3,是从reverseByRecursion(node1)返回的。
  11. 现在列表颠倒了,以node3 为首。

图片 2

图片 3

【讨论】:

  • 感谢您的解释。
【解决方案2】:

您的基本情况是,如果没有更多元素,则当前节点将成为列表的头部。

head->next->next = head 行意味着下一个节点正在被重用,其指针指向后方(与之前的方向相反)。由于该节点曾经是当前节点之后的NEXT节点,所以它成为当前头之前的PREVIOUS节点,因此它的next指针应该指向当前节点(“头”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多