一、题目要求
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
二、初步解法
2.1 初步思想
使用ArrayLisat存储链表中所有结点,之后检查前一半和后一半结点是否相同。
2.2 代码实现
class Solution {
public boolean isPalindrome(ListNode head) {
//遍历一次
List<Integer> l = new ArrayList();
int listLength = 0;
while(head != null) {
listLength++;
l.add(head.val);
head = head.next;
}
boolean isOk = true;
for(int i = 0; i < listLength/2+1; i++) {
if(l.get(i) != l.get(listLength-1-i)) {
return false;
}
}
return isOk;
}
}
2.3 运行结果
空间复杂度O(N),时间复杂度O(N)。
三、其他解法
3.1 算法思想
先遍历链表取得其长度,随后将链表结点复制进数组,比较前一半数组与后一半是否相同。
3.2 代码实现
class Solution {
public boolean isPalindrome(ListNode head) {
//遍历一次
int listLength = 0;
ListNode headPtr = head;
while(head != null) {
listLength++;
head = head.next;
}
int[] arr = new int[listLength];
boolean isOk = true;
for(int i = 0; i < listLength; i++) {
arr[i] = headPtr.val;
headPtr = headPtr.next;
}
for(int i = 0; i < listLength/2+1; i++) {
if(arr[i] != arr[listLength-1-i]) {
return false;
}
}
return isOk;
}
}
3.3 运行结果
空间复杂度O(N),时间复杂度O(N)。