【问题标题】:Reverse a linked list反转一个链表
【发布时间】:2011-12-11 16:03:24
【问题描述】:

任务是反转一个链表,所以我建立了链表,然后打印出来,然后所有的反转功能,然后我们第二次打印它。但是,第二个打印是空的。我认为这是指针问题,任何人都可以解释吗?谢谢。

void reverseLinkedList(struct node** head) {
    struct node* curr, *prev, *temp;

    curr = *head;
    prev = NULL;

    while (curr) {
        temp = prev;
        prev = curr;        
        curr = curr->next;
        prev = temp;
    }
    *head = prev;
}

struct node* buildLinkedList(int list[], int len) {
    struct node* head = NULL;
    struct node* tail = NULL;
    struct node* node;
    int i;

    for (i = 0; i < len; i++) {
        node = (struct node*) malloc(sizeof(struct node));
        node->data = list[i];
        node->next = NULL;

        if (!head) {
            head = node;
        } else {
            tail->next = node;
        }
        tail = node;
    }
    return head;
}

void printLinkedList(struct node** head) {
    struct node* s = *head;
    while(s) {
        printf("%d\t", s->data);
        s = s->next;
    }
    printf("\n");
}

int main() {
    int list [6] = {6,7,8,3,4,5};
    struct node* header = NULL;
    header = buildLinkedList(list, 6);
    printLinkedList(&header);
    reverseLinkedList(&header);
    printLinkedList(&header);

}

我从控制台得到的结果是:

6       7       8       3       4       5   

第二个 printLinkedList 没有打印任何内容。想知道问题出在哪里。谢谢。

【问题讨论】:

  • 您是否曾单步执行代码并观察调试器中的数据变化?这在查找错误时很有帮助。
  • 投票关闭:你可以通过在调试器中单步调试代码来解决这个问题,或者通过添加一堆 printf 语句来告诉你中间变量的状态。

标签: c pointers printing linked-list reverse


【解决方案1】:

查看您的功能以反转您拥有的列表

while (curr) {
     temp = prev;
     prev = curr;        
     curr = curr->next;
     prev = temp;  // <<-- this resets prev to what it was before.
}

您永远不会更改 next 指针,但您会更改两次 prev

【讨论】:

  • 谢谢。是的,我更改了最后一个 prev-&gt;next = temp 并且工作完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 2020-12-25
  • 2016-09-29
相关资源
最近更新 更多