题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false示例 2:
输入: 1->2->2->1 输出: true进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
分析
1.遍历链表存放数组里面,然后比较是否是回文字符串,空间复杂度On;
2.将链表前半部分存放到数组中,用数组和后半部分的链表进行比较是否是字符串,空间复杂度O 2/n;
3.将链表后半部分进行链表翻转,前面有道题是关于链表翻转的,详细可以参考这个 反转链表 ,再拿链表前半部分和后半部分比较是否是回文。详细点儿:fast 和 slow 指针吧就叫它们,fast每次向下跳两个,slow每次向下跳一个,当fast跳完之后,slow指针则指向链表中间(奇数指向2/n+1,偶数指向2/n);然后将slow后的进行链表反转,最后从head开始 从slow开始比较。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
if (fast != null){//ji
slow = slow.next;
slow = reverse(slow);
}else{//ou
slow = reverse(slow);
}
while (slow != null){
if (slow.val == head.val){
slow = slow.next;
head = head.next;
}else return false;
}
return true;
}
public static ListNode reverse(ListNode head){
if (head == null) return null;
if (head.next == null) return head;
ListNode temp = head.next;
ListNode n = reverse(temp);
head.next = null;
temp.next = head;
return n;
}
}