题目描述:
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1] 输出:true
示例 2:
输入:head = [1,2] 输出:false
思路描述:
我们可以遍历一下数组将链表中的值依次放在一个列表中,然后对列表进行从左右两端向中间进行遍历,因为这样我们就知道对应的长度,并能够使得最后的结点找到上一个结点,如果直接对链表操作,我们要通过复杂的操作才能找到一个结点的上一个结点。而对于数组来说就比较简单了。
但是,我们在考虑使用的列表类型的时候,还要根据列表类型特点来分别选择。对于ArrayList来说,我们读和取元素比较简单,时间效率比较好,而对于LinkedList来说,其插入和删除的时间效率就比较高。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null){
return false;
}
if(head.next==null){
return true;
}
List<Integer> result=new LinkedList<>();
ListNode p=head;
while(p!=null){
result.add(p.val);
p=p.next;
}
int left=0;
int right=result.size()-1;
while(left<=right){
if(result.get(left)==result.get(right)){
left++;
right--;
}else{
return false;
}
}
return true;
}
}
这种方法是通不过力扣的,因为LinkedList的读数据的时间效率比较差。
因此,我们可以将其换成ArrayList。
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null){
return false;
}
if(head.next==null){
return true;
}
List<Integer> result=new ArrayList<>();
ListNode p=head;
while(p!=null){
result.add(p.val);
p=p.next;
}
int left=0;
int right=result.size()-1;
while(left<=right){
if(result.get(left)==result.get(right)){
left++;
right--;
}else{
return false;
}
}
return true;
}
}