题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
O(n) 时间复杂度+ O(1) 空间复杂度
代码示例
public boolean isPalindrome(ListNode head) {
ListNode slow = head,fast = head;
ListNode prev = null;
while (fast != null && fast.next != null) {
fast = fast.next.next;
ListNode nextNode = slow.next;
slow.next = prev;
prev = slow;
slow = nextNode;
}
ListNode a=prev,b;
b = (fast == null) ? slow : slow.next;
while (a != null && b != null) {
if (a.val == b.val) {
a = a.next;
b = b.next;
} else {
return false;
}
}
return true;
}
要点(思路)
- 回文的核心判断逻辑在中心节点,所以要找链表的中心
- 找中心,可以采用快慢指针法
- 拆成两个,左侧反转才能进行比较判断(翻转单链表)
- 奇偶两种情况的判断
算法图解
找中心节点和翻转操作放在一起完成,注意这个1,fast先走(不然链表断开,当时这问题想了好一会儿)
循环结束条件判断
情况1:链表节点数为偶数时,fast为null循环结束(两个2同为中心,这个2算是左中心,哈哈)
情况2:链表节点数为奇数时,fast.next为null循环结束
所以执行条件就是(fast != null && fast.next != null)
整理
这就很简单了,中心找到了,链表也翻转了,现在分下左右链表,好让他进行判断。
判断那就更简单了!
OK,完事!