题目:
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例:
输入:head = [1,2,2,1] 输出:true
思路:
快慢指针,快走两步,慢走一步。走的时候就反转前面的链表
快指针到终点慢在中间 ,然后slow继续往后走,和之前反转的链表对比,就可以了。
还是那句话,要熟悉数据结构
复杂度:
时间复杂度:遍历O(n)
空间复杂度:O(1)
代码:
public boolean isPalindrome(ListNode head) {
//特殊情况
if(head == null || head.next == null) return true;
//定义快慢指针
ListNode slow = head,fast = head;
//定义反转用结点
ListNode pre = null;
while(fast != null && fast.next!= null){
//走两步
fast = fast.next.next;
//用temp记录满指针的下一个节点
ListNode temp = slow.next;
//将其反转
slow.next = pre;
pre = slow;
//slow往后走
slow = temp;
}
//此时fast走到最后,数列是奇数的,slow还要往后走一步
if(fast!=null){
slow = slow.next;
//走这一步是为了从下一步开始和之前反转的链表进行比较了
}
while(pre!=null && slow!=null){
if(pre.val!=slow.val){
return false;
}
pre = pre.next;
slow = slow.next;
}
return true;
}