用栈判断回文的核心是只存前半段并逐个匹配后半段,以节省空间并直击对称本质;需准确处理中点定位与栈指针初始化;链表中结合快慢指针找中点;相比双指针法,栈方案更清晰易调试。

用栈判断回文,核心在于利用“后进先出”的特性模拟字符串的逆序读取,从而与原顺序比对。关键不是把整个字符串压栈再全弹出——那样只是复制了一遍;真正有效的方式是只存一半、再逐个匹配另一半,既节省空间,又直击对称本质。
栈怎么配合对称逻辑工作
回文的本质是位置对称:第1个字符等于最后一个,第2个等于倒数第二个……以此类推。栈天然适合做“反向索引”——把前半段字符依次入栈后,第一次出栈得到的就是原串末尾对应的字符。只要每出一个,就立刻和后半段对应位置的字符比较,就能边比边验证,不必等全部操作完成。
- 字符串长度为偶数(如"abccba"):前半段("abc")入栈,后半段("cba")从左到右依次与出栈字符比对
- 字符串长度为奇数(如"abcba"):中间字符('c')跳过不参与比对,前半段("ab")入栈,后半段从中间后一位开始("ba")比对
实际编码中必须处理的两个细节
一是中点定位要准确。不能简单用 len/2 当作前半段终点下标,因为数组下标从0开始,且需区分奇偶。常用做法是计算 mid = len / 2 - 1 作为前半段最后一个下标(适用于0-based索引),再根据 len % 2 决定后半段起始位置。
二是栈顶指针初始化方式影响边界判断。若初始化为 top = 0,则入栈用 s[++top] = x;若初始化为 top = -1,则入栈用 s[++top] = x 或 s[top++] = x,但出栈逻辑要同步调整。不统一容易导致越界或漏判。
链表场景下的适配要点
单链表无法随机访问,所以不能像数组那样靠下标取前后字符。此时栈的作用转为“暂存前半段值”,配合快慢指针找中点:
- 慢指针走一步、快指针走两步,快指针到尾时,慢指针恰好停在中点(奇数长度)或前半段末尾(偶数长度)
- 遍历过程中,慢指针每前进一步,就把当前节点值压栈
- 从中点后一个节点开始,逐个出栈并比对节点值,直到栈空或发现不等
- 若链表长为奇数,中点节点值不入栈也不参与比对,直接跳过
为什么不用栈也能做,但用栈更清晰
双指针法(首尾向中间收缩)时间空间都更优,但逻辑隐含了“对称索引映射”这一抽象;而栈方案把“反转前半段”显式地拆解为入栈→出栈→比对三步,每步可单独调试、验证,尤其适合教学理解或需要分阶段校验的场景。它不追求极致性能,而是让对称性检查的过程变得可观察、可中断、可复现。

















