[LeetCode]234. 回文链表(java实现)
1. 题目
要求:O(n)时间复杂度和O(1)空间复杂度
2. 读题(需要重点注意的东西)
回文:如121,正看反看都是121;上海自来水来自海上,正看反看都一样,称为回文。
思路:找到中间节点,反转后半段,与前半段比较
3. 解法
/**
* 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; }
* }
*/
// 回文:正反读是一致的,称之为回文
// 进阶要求:O(n)时间复杂度和O(1)空间复杂度
// 找到中间节点,反转后半段,与前半段比较
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) return true;
// 快慢指针找中点 O(n)
ListNode slow = head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
// 反转slow后面的节点 O(n)
slow = slow.next;
ListNode pre = null;
while(slow != null){
ListNode temp = slow.next;
slow.next = pre;
pre = slow;
slow = temp;
}
// 比较O(n)
while(head != null && pre != null){
if(head.val != pre.val) return false;
head = head.next;
pre = pre.next;
}
return true;
// 没有产生额外的空间消耗O(1)
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
链表的题目要多注意一些细节,哪里需要.next,哪里没有.next,都要注意。