题目的意思很简单,给定一个单链表,判断是否回文
我最开始的做法就是每次找到中间的两个位置进行匹配(考虑奇偶)
匹配后删除这两个元素,再从头指针开始找中间位置,重复这个操作直到链表为空
ps:需要对空表以及只含一个元素的链表进行特殊处理
这样的思路虽然是正确的,但是太慢了,代码如下:
|
|
题目中提示存在时间O(n)、空间O(1)的算法
后来苦苦想了几个小时也没想出来,在网上查找相关资料发现有种神奇的快慢指针
方法
就是先利用快慢指针
找到链表中间位置,将后半段倒序处理后与前半段一次比较即可(可以借助栈来实现,此时空间复杂度为O(n))
快慢指针
的应用还有很多,这里限于篇幅就不一一赘述了
改进后代码如下:
|
|
这份代码值得一说的就是在判断完成后又将链表逆置了一遍,从而保证不改变原链表结构