一、題目描述
判斷鏈表是否是迴文鏈表,要求時間複雜度爲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;
}
}