给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1] 输出:true
示例 2:
输入:head = [1,2] 输出:false
遇到这道题:首先会想到回文结构,回文结构就是一个链表的原链表与反转链表是相同的,这种链表叫做回文链表。
思路:
如果是回文链表返回true,如果不是则返回false
自己的理解想法:来自于官网
官网提供的第一个方法。
【将值复制到数组中再用双指针】
分为两步:
第一步:将链表中的值复制到数组中
第二步:再使用双指针去比较指针所指向的节点的值是否相等
具体做法:将链表中的值复制到数组中,再设置两个指针,在起点放置一个指针,在结尾放置一个指针,每一次迭代判断两个指针指向的元素是否相同,若不同,返回 false;相同则将两个指针向内移动,并继续判断,直到两个指针相遇。
代码展示如下:
public boolean isPalindrome(ListNode head){
List<Integer> vals = new ArrayList<>();
//将链表的值复制到数组中
ListNode currentNode = head;
while (currentNode != null){
vals.add(currentNode.val);
currentNode = currentNode.next;
}
//设置双指针对比值是否相同
int front = 0;
int back = vals.size() - 1;
while (front < back){
if(!vals.get(front).equals(vals.get(back))){
return false;
}
front++;
back--;
}
return true;
}