【问题标题】:Can you please help me resolve this ReverseRange Function?你能帮我解决这个 ReverseRange 函数吗?
【发布时间】:2021-08-29 13:01:08
【问题描述】:

我正在尝试编写一个函数ReverseRange(struct Node **head, int x, int y),它将反转给定索引范围内的链表int xint y。我在ReverseRange() 的条件之一中使用了先前定义的函数Reverse(),但它没有反转给定的列表,只打印一个带有数据'Q' 的节点。我不知道错误是否在Print()Reverse()ReverseRange() 或其他地方。请帮忙,谢谢。

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

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

//insert data in the node
void Insert(struct Node **Head, char data) {
    struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
    temp->data = data;
    temp->next = *Head;
    *Head = temp;
}

//find length of linked list 
int LengthRec(struct Node *head) {
    if (head == NULL)
        return 0;
    return 1 + LengthRec(head->next);
}

//Reverse a linked list when head is given;
void Reverse(struct Node **head) {
    struct Node *prev = NULL;
    struct Node *curr = *head;
    struct Node *next = NULL;
    while (curr != NULL) {
        next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }
    *head = prev;
}

//Reverse list in range x to y;
int ReverseRange(struct Node **H, int x, int y) {
    struct Node *Head = *H;
    if (Head == NULL)
        return -1;
    else if (Head->next == NULL)
        return -1;
    else if (x == y)
        return -1;
    else if (x > y)
        return -1;
    else if (LengthRec(Head) >= y) {
        if (x == 1 && y == LengthRec(Head)) {
            Reverse(&Head);
            return 1;
        }
        /* NOTE:: 
           Code is incomplete, because I found error before
           the entire code is written,
        */
    }
}

void Print(struct Node **H) {
    struct Node *head = *H;
    if (head == NULL) {
        printf("Head=NULL");
        return;
    }
    printf("\n %c", head->data);
    while (head->next != NULL) {
        head = head->next;
        printf("\t%c", head->data);
    }
}

int main() {
    struct Node *Head = NULL;
    Insert(&Head, 'Q');
    Insert(&Head, 'W');
    Insert(&Head, 'E');
    Insert(&Head, 'R');
    Insert(&Head, 'T');
    Print(&Head);
    Reverse(&Head);
    Print(&Head);
    ReverseRange(&Head, 1, 5);
    Print(&Head);
}

输出:

 T      R       E       W       Q
 Q      W       E       R       T
 Q

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    Reverse 函数看起来不错,但应该使用 H 作为来自 ReverseRange() 的参数调用它,而不是使用局部变量 &amp;Head

    函数开头的一些显式测试对应于合法参数,不应返回错误值。

    还请注意,您应该记录xy 的精确语义:在C 中使用1 来指定集合的​​第一个元素不是惯用的,0 很常见。 y 似乎包含在内,这也不是惯用的,但与使用 1 作为第一个元素一致。

    您的LengthRec 函数效率非常低,对于很长的列表可能会导致堆栈溢出。使用循环而不是递归,因为此递归不是尾递归。

    这是修改后的版本:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Node {
        char data;
        struct Node *next;
    };
    
    //insert data in the node
    void Insert(struct Node **Head, char data) {
        struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
        temp->data = data;
        temp->next = *Head;
        *Head = temp;
    }
    
    //find length of linked list
    int ListLength(const struct Node *head) {
        int length = 0;
        while (head != NULL) {
            length++;
            head = head->next;
        }
        return length;
    }
    
    //Reverse a linked list when head is given;
    void Reverse(struct Node **head) {
        struct Node *prev = NULL;
        struct Node *curr = *head;
        while (curr != NULL) {
            struct Node *next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        *head = prev;
    }
    
    //Reverse list in range x to y;
    int ReverseRange(struct Node **H, int x, int y) {
        int length = ListLength(*H);
    
        if (x < 1 || x > length || x > y || y > length)
            return -1;
        if (x == y)
            return 1;
        if (x == 1 && y == length) {
            Reverse(H);
            return 1;
        } else {
            struct Node **head = H;
            struct Node *prev = NULL;
            struct Node *curr = *head;
            struct Node *last;
    
            while (x > 1) {
                head = &curr->next;
                curr = *head;
                x--;
                y--;
            }
            last = curr;
            while (x <= y) {
                struct Node *next = curr->next;
                curr->next = prev;
                prev = curr;
                curr = next;
                x++;
            }
            last->next = curr;
            *head = prev;
            return 1;
        }
    }
    
    void Print(const char *msg, const struct Node *head) {
        if (msg) {
            printf("%s", msg);
        }
        if (head == NULL) {
            printf("Head=NULL\n");
            return;
        }
        printf("%c", head->data);
        while (head->next != NULL) {
            head = head->next;
            printf("\t%c", head->data);
        }
        printf("\n");
    }
    
    int main() {
        struct Node *Head = NULL;
        Insert(&Head, 'E');
        Insert(&Head, 'D');
        Insert(&Head, 'C');
        Insert(&Head, 'B');
        Insert(&Head, 'A');
        Print("           Initial list:\t", Head);
        Reverse(&Head);
        Print("         Reverse(&Head):\t", Head);
        ReverseRange(&Head, 1, 5);
        Print("ReverseRange(&Head,1,5):\t", Head);
        ReverseRange(&Head, 1, 1);
        Print("ReverseRange(&Head,1,1):\t", Head);
        ReverseRange(&Head, 2, 4);
        Print("ReverseRange(&Head,2,4):\t", Head);
        return 0;
    }
    

    输出:

               Initial list:        A       B       C       D       E
             Reverse(&Head):        E       D       C       B       A                                                                           ReverseRange(&Head,1,5):        A       B       C       D       E
    ReverseRange(&Head,1,1):        A       B       C       D       E
    ReverseRange(&Head,2,4):        A       D       C       B       E
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 2011-01-24
      • 2021-08-14
      • 2021-01-28
      • 2013-01-28
      相关资源
      最近更新 更多