- 回文链表
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
提示:
- 链表中节点数目在范围
[1, 105]
内 0 <= Node.val <= 9
**进阶:**你能否用 O(n)
时间复杂度和 O(1)
空间复杂度解决此题?
这道题很多人把链表的值放到一个数组中,然后通过双指针进行遍历来判断。这个方法是比较容易想起来的,因为我刚做过反转链表的题,因此立马就想到这道题与反转链表相关,解题方法就是
将前半部分或者后半部分链表反转
,然后将两段链表对比就可以了。
具体解题思路:
-
通过快慢指针对链表进行遍历,slow(慢指针)每次走一个,fast(快指针)每次走两个,当快指针结束时,慢指针走到后半部分链表的头部。
while(fast!= null && fast.next!= null){ help = slow; //1 slow = slow.next; //2 fast = fast.next.next;//3 help.next = node; //4 node = help;//5 }
-
将前半部分链表进行反转(上面代码的1、4、5已经对前半部分链表进行反转了)。
-
对比前半部分和后半部分链表
while(help != null && slow != null){ if(help.val != slow.val) return false; help = help.next; slow = slow.next; }
具体java实现代码:
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null){
return true;
}
ListNode slow = head;
ListNode fast = head;
ListNode help = head;
ListNode node = null;
while(fast!= null && fast.next!= null){
help = slow;
slow = slow.next;
fast = fast.next.next;
help.next = node;
node = help;
}
if(fast != null){//这块内容是当链表个数为奇数时,因为上面遍历刚好slow到中间位置,再移动一次就到链表后半部分的首节点了!!!
slow = slow.next;
}
while(help != null && slow != null){
if(help.val != slow.val) return false;
help = help.next;
slow = slow.next;
}
return true;
}
}