一、题目描述
判断链表是否是回文链表,要求时间复杂度为O(n),空间复杂度为O(1)
二、解题思路
1、取得链表的长度
2、反转任意一半链表
3、双指针从前往后扫描,判断是否是回文链表
三、代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
/**
1.获取链表长度
*/
public int lengthOfList(ListNode head) {
ListNode p = head;
int n = 0;
while ( p != null) {
n++;
p = p.next;
}
return n;
}
/**
2.反转一半链表
*/
public ListNode reverseList(ListNode head) {
ListNode pre = head;
ListNode p = pre.next;
ListNode next;
while (p != null) {
next = p.next;
p.next = pre;
pre = p;
p = next;
}
head.next = null;
return pre;
}
/**
3.判断是否是回文链表
*/
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null)
return true;
int n = lengthOfList(head); //获取链表的长度
int half = n/2;
//1 2 3 4 3 2 1
ListNode leftEnd = head;
for (int i = 0; i < half - 1; i++) {
leftEnd = leftEnd.next;
}
ListNode rightStart = leftEnd.next;
if(n%2 != 0){
rightStart = rightStart.next;
}
rightStart = reverseList(rightStart);
ListNode leftStart = head;
for (int i = 1; i <= half; i++) {
if(leftStart.val != rightStart.val) {
return false;
} else {
leftStart = leftStart.next;
rightStart = rightStart.next;
}
}
return true;
}
}