题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路
这个题目是简单难度,思路还是都有且挺多的
新建一个反转链表作对比,使用栈等思路简单好想,但是空间复杂度是O(n),不满足进阶要求。
不过站在大牛们的肩膀上找到了一个新的思路:
快慢指针寻找中点,然后dummyHead + 头插法在O(1)空间复杂度上反转后半段,然后对比前半链和新的反转链。代码如下:
代码
function isPalindrome($head) {
$centerNode = $doubleNode = $head;
//快慢指针,定位中间位置
while($doubleNode && $doubleNode->next){
$centerNode = $centerNode->next;
$doubleNode = $doubleNode->next->next;
}
//反转后半链表
$dummyHead = new ListNode(null);
//使用dummyHead则保证所有节点都有前置指针,更不容易出问题
$mheadTmp = $centerNode;
while($mheadTmp){
$curNode = $mheadTmp;
$mheadTmp = $mheadTmp->next;
$curNode->next = $dummyHead->next;
$dummyHead->next = $curNode;
}
$mhead = $dummyHead->next;
$thead = $head;
while($thead && $mhead){
if($thead->val != $mhead->val){
return false;
} else {
$thead = $thead->next;
$mhead = $mhead->next;
}
}
return true;
}
欢迎大家关注我的公众号
半亩房顶
网友评论