本题重要点
-
反转链表
-
快慢指针,一个二倍速,一个一倍速,可以获取一个链表的中间节点
1->2->3-4->null
=> 3->4->null
1->2->3->4->5->null
=> 3->4->5->null
- 后半段反转后,依次和总的链表进行比较,如果不同就false,这里就是一个长链表和一个短链表的对比了,大可不必担心,这个链表是奇数还是偶数
//请判断一个链表是否为回文链表。
//
// 示例 1:
//
// 输入: 1->2
//输出: false
//
// 示例 2:
//
// 输入: 1->2->2->1
//输出: true
//
//
// 进阶:
//你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
// Related Topics 链表 双指针
// 👍 744 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode curr = null;
ListNode pre = head;
while (pre != null) {
ListNode tempNode = pre.next;
pre.next = curr;
curr = pre;
pre = tempNode;
}
return curr;
}
public ListNode getHalfNode(ListNode head) {
ListNode fast = head;
ListNode low = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
low = low.next;
}
return low;
}
public boolean isPalindrome(ListNode head) {
ListNode temp = head;
ListNode half = getHalfNode(temp);
ListNode reverseList = reverseList(half);
ListNode p = head;
ListNode q = reverseList;
while (q != null) {
if (p.val != q.val) {
return false;
}
p = p.next;
q = q.next;
}
return true;
}
}
//leetcode submit region end(Prohibit modification and deletion)