簡體   English   中英

我正在嘗試使用 C 中的遞歸來反轉鏈表,我對我的遞歸 function 有一些疑問

[英]I am trying to reverse a linked list using recursion in C, I have some doubts on my recursive function

下面是程序

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int data;
    struct node *next;
};
struct node *head;
struct node* reverse_ll(struct node* hnode)
{
    if(hnode == 0)
    {
        return 0;
    }
    if(hnode->next == 0)
    {
        head=hnode;
        return hnode;
    }
    struct node* ptr=reverse_ll(hnode->next);
    ptr->next=hnode;
    hnode->next=0;

 //return hnode;
}
void display()
{
    struct node *ptr;
    ptr=head;
    if(ptr==0)
    {
    printf("empty");
    }
    else
    {
        while(ptr!=0)
        {
            printf("%d->",ptr->data);
            ptr=ptr->next;

        }
          printf("null");
    }
}
int main()
{
struct node* h;    
lastinsert(1);
lastinsert(2);
lastinsert(3);
lastinsert(4);
lastinsert(5);
display();
h=reverse_ll(head);
display();
return 0;
}

在 function reverse_ll() 中,即使我評論“返回 hnode”,我也得到了正確的 output 當我評論“返回 hnode”時,ptr 如何從哪里接收它的地址?

output:1->2->3->4->5->空 5->4->3->2->1->空

reverse_ll()在遞歸情況下必須返回一個struct node *

#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
    struct node *next;
};
struct node *head;

void lastinsert(int data) {
    struct node **c = &head;
    for(; *c; c = &(*c)->next);
    *c = malloc(sizeof(*head));
    if (!(*c)) {
        printf("malloc failed\n");
        return;
    }
    (*c)->data = data;
    (*c)->next = NULL;
}

struct node *reverse_ll(struct node* hnode) {
    if(!hnode)
        return NULL;
    if(!hnode->next) {
        head = hnode;
        return hnode;
    }
    struct node *ptr=reverse_ll(hnode->next);
    ptr->next=hnode;
    hnode->next = NULL;
    return hnode;
}

void display() {
    if(!head) {
        printf("empty");
        return;
    }
    for(struct node *ptr = head; ptr; ptr = ptr->next) {
        printf("%d->",ptr->data);
    }
    printf("null\n");
}

int main() {
    for(int i = 1; i <= 5; i++) {
        lastinsert(i);
    }
    display();
    reverse_ll(head);
    display();
    // It's good practice to implement a function that frees you list
    // which you would call here.
    return 0;
}

和示例運行:

$ ./a.out
1->2->3->4->5->null
5->4->3->2->1->null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM