如何理解head-> next-> next = head;通过递归反向单列表?

时间:2016-06-16 00:56:54

标签: algorithm recursion linked-list

一个信号链接列表,我希望通过递归来实现它。但我不理解这一行的含义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;    
}

2 个答案:

答案 0 :(得分:3)

让我使用这个列表。

initial list

  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. newHeadnode3,从reverseByRecursion(head2)返回。
  8. head = node1head->next = node2,因此head->next->next = head;会将node2->next设置为node1
  9. head->next = NULL;会将node1->next设置为NULL。 (图3)
  10. newHeadnode3,从reverseByRecursion(node1)返回。
  11. 现在,以node3作为头部,列表正好相反。
  12. 图片2
    modified list

    图片3
    reversed list

答案 1 :(得分:0)

您的基本案例表明,如果没有更多元素,那么当前节点将成为列表的头部。

head-> next-> next = head line表示正在重复使用下一个节点,其指针指向后方(与之前相反的方向)。由于节点曾经是当前节点之后的NEXT节点,因此它成为当前节点之前的PREVIOUS节点,因此它的下一个指针应该指向当前节点(" head")。