反转单链表的递归方法?

时间:2016-09-15 17:45:34

标签: c recursion singly-linked-list generic-programming

我已经在

中看到了这个递归程序(用C语言编写)

http://www.geeksforgeeks.org/write-a-function-to-reverse-the-nodes-of-a-linked-list/

用于反转单链表。

void recursiveReverse(struct node** head_ref){

struct node* first;
struct node* rest;

/* empty list */
if (*head_ref == NULL)
   return;   

/* suppose first = {1, 2, 3}, rest = {2, 3} */
first = *head_ref;  
rest  = first->next;

/* List has only one node */
if (rest == NULL)
   return;   

/* reverse the rest list and put the first element at the end */
recursiveReverse(&rest);
first->next->next  = first;  

/* tricky step -- see the diagram */
first->next  = NULL;          

/* fix the head pointer */
*head_ref = rest;}

在程序的这一步中,

/* reverse the rest list and put the first element at the end */
    recursiveReverse(&rest);
    first->next->next  = first; 

我可以写" rest-> next = first; "而不是" first-> next-> next = first; " ?

或者写作是否有任何意义? first-> next-> next = first; " ?

1 个答案:

答案 0 :(得分:0)

那么,当你尝试改变时发生了什么? course 你可以写它......但是语义可能会改变。

first->next分配给rest不会强制它们始终相同。您之前的语句将指针传递给rest recursiveReverse。简而言之,您期望 rest进行更改。

rest现在应该指向颠倒列表的其余部分的头部。这不再是first->next;现在应该是反向列表的 end ,其中rest是该列表的头部。

这能解释得好吗?如果没有,请在几个打印陈述中说明您的程序在每种情况下的作用。