双向链表反转无返回值且调用后输出空列表问题求助
双向链表反转后变空?这几个坑你踩中了
嘿,看你的问题描述和代码片段,我一眼就发现几个会导致链表反转后变空的关键问题,咱们一个个说:
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
相关产品推荐
相关产品推荐

