开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
题目、234. 回文链表
原题链接:234. 回文链表
题目描述:
给你一个单链表的头节点
head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回 >false。/
示例 1:
输入:head = [1,2,2,1]
输出:true
/
示例 2:
输入:head = [1,2]
输出:false
解题思路:
我们需要判断链表中的节点值是否为回文字,如果靠链表来遍历判断,这是十分困难的,因为链表遍历只能从头到尾,而且遍历过后就不能再遍历回当前位置之前的节点了。
如果元素都存放在数组中,我们就可以借助双指针,头位置向后遍历的同时,末尾位置向前遍历,如果两个指针遍历到的元素完全相同,我们就可以确定这是回文串了,反之就能确定不是回文串。
所以为了让判断变得简单起来,我们需要准备一个数组,通过遍历链表将链表节点按照原本的顺序存放到数组中,在对数组进行双指针遍历。
这样一来我们就可以解决这个问题啦...
提交代码:
/**
* 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) {
ArrayList<Integer> list = new ArrayList<>(); //常见数组集合list
while(head != null){ //遍历链表
list.add(head.val); //链表元素存入数组集合中
head = head.next; //位置向后移动,遍历下一个节点
}
int left = 0; //集合第一个元素下标
int right = list.size()-1;//集合最后一个元素下标
while(left < right){ //双指针同时遍历
if(list.get(left) != list.get(right)) //如果遇到两个指针指向不同值的情况
return false; //说明不是回文串,返回false
++left; //左指针后移
--right; //右指针前移
}
return true; //指针错位前,遍历没有停止,说明为回文串
}
}
提交结果: