C中的递归链表反转函数

时间:2013-11-04 23:28:38

标签: c recursion linked-list reverse

我的列表是通过这两个结构实现的。第一个包含列表中的项目,第二个包含列表本身。

typedef Employee Item;

typedef struct ListNodeTag {
    Item item;
    struct ListNodeTag *next;
} ListNode;

typedef struct {
    int size;
    ListNode *first;
} List;

我正在尝试使用以下递归函数来反转列表的内容,但是,如果列表中有多个项目,则会出现分段错误。

void Reverse(List *L){
  ListNode *q,*p;

  q = L->first;
  p = q->next;

  if(p == NULL)
    return;

  Reverse(L);

  q->next->next = q;
  q->next = NULL;}

我认为问题在于,我不是将列表成员作为函数参数传递,而是传递指向列表本身的指针。如何在不传递不同参数的情况下更改此代码以使其工作?

2 个答案:

答案 0 :(得分:0)

在将项目追加到列表中时,您是否确保将所有下一个指针初始化为NULL?

另外,当我读到它时,该函数实际上不会递归,因为你总是传递L.换句话说,在第一次调用之后,函数如何知道再向下一步?

答案 1 :(得分:0)

您需要将另一个参数传递给函数,以将递归函数推进到列表的末尾。这可以这样做 -

void Reverse(ListNode *f, List *l){
    if(l->first == NULL)
        return;

    //Last node reached
    if(f->next==NULL){
        l->first->next = NULL;
        l->first = f;
        return;
    }
    ListNode *p,*q;
    p = f;
    q = f->next;

    Reverse(f->next,l);

    q->next = p;
}

虽然这个功能有效,但需要大量内存,所以我建议采用迭代方法,就像这个 -

void Reverse(List *l){
    ListNode *f = l->first;
    ListNode *fn,*fnn;

    if(f==NULL)
        return;
    fn = f->next;
    if(fn==NULL)
        return;
    fnn = fn->next;

    while(fnn!=NULL){
        fn->next = f;
        f = fn;
        fn = fnn;
        fnn = fnn->next;
    }
    fn->next = f;
    l->first->next = NULL;
    l->first = fn;
}