最近学得心好累,很烦,唯一能坚持下来的就是一天一道算法一篇博客了。
有没有真人给我点个赞啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
题目
思路一:将值复制到数组中然后用双指针法
左指针右移,右指针左移,不断判断是否相同即可。
时间复杂度为o(1)空间复杂度为o(n)
不太建议该方法,实际上相当于在数组上的判断。
思路二:反转后半链表后双指针
首先我们要先找到链表的中间,然后将中间及其后面部分反转。
找到链表中间--快慢指针法:快慢指针同期点,慢指针走一步,块指针走两步,在快指针及快指针下一个元素不为空的情况下,不断往前走;最后慢指针停下来的地方就是链表中间的地方(如果是偶数个,那就是中间偏右)。
反转后半链表:见我上篇文章--反转链表
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode slow = head;//慢指针
ListNode quick = head;//块指针
while(quick != null && quick.next!= null){
slow = slow.next;
quick = quick.next.next;
}
ListNode headb = reverse(slow);
ListNode heada = head;
while(heada != null && headb != null){
if(heada.val != headb.val)return false;
heada = heada.next;
headb = headb.next;
}
return true;
}
//反转链表
public ListNode reverse(ListNode head){
ListNode p = null;
ListNode pp = head;
while(pp != null){
ListNode ppp = pp.next;
pp.next = p;
p = pp;
pp = ppp;
}
return p;
}
}