C语言链表回文检测程序如何显示原始输入而非反转序列
问题原因分析
- 你当前的
insertNum函数使用的是头插法:每次新输入的数字都会插入到链表的最开头,所以输入顺序3、2、1最终存储的链表结构是1->2->3,直接输出自然和输入顺序相反。 - 现有回文检测的逻辑是对比原链表和反转后的链表是否一致,该逻辑不受链表存储顺序的影响,所以无论修改插入逻辑还是仅修改显示逻辑,都不会破坏原有检测功能。
方案1:修改插入逻辑为尾插法(推荐,改动最少)
直接将插入逻辑改为每次把新节点放到链表尾部,这样链表存储顺序和输入顺序完全一致,显示、回文检测的其他逻辑都不需要调整。
替换原insertNum函数代码即可:
void insertNum(struct node** head, int number) { struct node* temp = malloc(sizeof(struct node)); temp->data = number; temp->next = NULL; // 空链表直接设为头节点 if (*head == NULL) { *head = temp; return; } // 遍历找到链表尾部 struct node* cur = *head; while (cur->next != NULL) { cur = cur->next; } cur->next = temp; }
修改后输入3、2、1时,链表存储结构为3->2->1,display函数输出的就是原始输入顺序,回文检测功能完全正常。
方案2:不修改插入逻辑,新增原始输入显示函数
如果不想改动原有插入逻辑,也可以单独新增递归显示函数,反向遍历头插法生成的链表,输出原始输入顺序:
// 新增递归显示原始输入的函数 void displayOriginal(struct node* head) { if (head == NULL) { return; } // 先递归输出后续节点,再输出当前节点 displayOriginal(head->next); printf("%d->", head->data); }
在main函数调用原有display之前,先调用该函数输出原始序列即可:
// main函数中修改对应部分 printf("原始输入序列:"); displayOriginal(head); printf("NULL\n"); display(head);
该方案完全不改动原有插入、回文检测逻辑,仅新增显示功能,更贴合“不破坏原有功能”的要求。
内容的提问来源于stack exchange,提问作者Michael Angelo Magante
相关产品推荐
相关产品推荐

