You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向链表反转无返回值且调用后输出空列表问题求助

双向链表反转后变空?这几个坑你踩中了

嘿,看你的问题描述和代码片段,我一眼就发现几个会导致链表反转后变空的关键问题,咱们一个个说:

1. 完全没必要的内存分配,还搞乱了指针

你开头给temp和corr都malloc了内存,但转头就把corr赋值成it->curr——这不仅平白无故造成了内存泄漏,而且完全是多此一举啊!反转双向链表根本不需要新建节点,只需要调整现有节点的指针指向就行,瞎malloc只会搞乱你的指针逻辑。

这段代码直接删掉就行:

temp = malloc(sizeof(Node));
corr = malloc(sizeof(Node));

2. 反转逻辑缺了核心步骤,等于没干活

双向链表反转的核心是啥?就是把每个节点的prev和next交换,最后还要把链表的头和尾换过来,不然你的遍历入口就没了。你原代码里只拿了corr = it->curr,但没处理指针交换,也没维护链表的head/tail,最后自然找不到节点,输出空列表。

假设你的链表结构是常见的这种:

typedef struct Node {
    int data;
    struct Node *prev;
    struct Node *next;
} Node;

typedef struct List {
    Node *head;
    Node *tail;
    Node *curr;
} List;

给你写个能跑的reverse函数,每一步都标清楚:

void reverse(List *it) {
    // 空链表直接返回,避免瞎折腾
    if (it->head == NULL) return;

    Node *temp;
    Node *current = it->head;

    // 遍历每个节点,交换prev和next指针
    while (current != NULL) {
        temp = current->next;
        current->next = current->prev;
        current->prev = temp;
        current = temp;
    }

    // 交换链表的头和尾,这步至关重要!不然遍历入口就错了
    temp = it->head;
    it->head = it->tail;
    it->tail = temp;

    // 把curr重置到新的头节点(或者按你需求调整位置)
    it->curr = it->head;
}

为啥你之前输出空列表?

你原代码没写完,但大概率是没处理head和tail的交换,而且错误的malloc可能让你不小心覆盖了链表的关键指针,最后打印的时候找不到有效节点,自然就显示空列表了。

额外提醒

  • 记得用指针传List参数!不然你改的只是函数里的副本,原链表根本不会变
  • 反转前先判断链表是否为空,避免空指针异常
  • 别随便malloc不需要的内存,内存泄漏排查起来头疼得很

内容的提问来源于stack exchange,提问作者Harris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:52:07