題目:
請判斷一個鏈表是否爲迴文鏈表。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
進階:
你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?
進階思考:反轉再比較,反轉用頭插法。
代碼:
package leetCode;
import java.util.concurrent.SynchronousQueue;
import leetCode.Nineteen.ListNode;
/**
* 2018.7.23
* 迴文鏈表
* @author dhc
*
*/
public class TwoHundredAndThirtyFour {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
//思路:可以先遍歷一下鏈表求長度,並且保存鏈表值,然後第二遍遍歷的時候從鏈表的中間開始判斷,即判斷對應位置的數
//但是空間複雜度爲O(n), 2ms
//看了一下前面大佬的答案,大概都用到了對鏈表的反轉,一種是反轉後半部分鏈表在比較,一種是直接反轉整個鏈表,如果反轉
//鏈表時用的是遞歸的話,空間複雜度爲O(n),如果用的是頭插法的話,空間複雜度就是O(1)
public static boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) {
return true;
}
boolean flag = true;
ListNode tem = head;
int length = 0;
//求鏈表長度
while(tem != null) {
length++;
tem = tem.next;
}
int[] val = new int[length/2];
tem = head;
int index = 0;
int index1 = 0;
boolean flag1 = true;
while(tem!=null) {
//先把前面部分的數存到數組 中
if(index1 < length/2) {
val[index1++] = tem.val;
tem = tem.next;
index = index1;
}else {
//從後面部分開始依次和前面對應的數比較,這裏需要區分一下長度爲奇偶的不同
if(length%2 == 0) {
if(val[--index] != tem.val) {
flag = false;
break;
}
tem = tem.next;
}else {
if(flag1) {
flag1 = false;
tem = tem.next;
}else {
if(val[--index] != tem.val) {
flag = false;
break;
}
tem = tem.next;
}
}
}
}
return flag;
}
public static void main(String[] args) {
ListNode head = new TwoHundredAndThirtyFour().new ListNode(1);
ListNode node1 = new TwoHundredAndThirtyFour().new ListNode(0);
ListNode node2 = new TwoHundredAndThirtyFour().new ListNode(1);
ListNode node3 = new TwoHundredAndThirtyFour().new ListNode(2);
ListNode node4 = new TwoHundredAndThirtyFour().new ListNode(2);
ListNode node5 = new TwoHundredAndThirtyFour().new ListNode(1);
head.next = node1;
node1.next = node2;
/*node2.next = node3;
node3.next = node4;
node4.next = node5;*/
System.out.println(isPalindrome(head));
}
}