关阿姨正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
首先跟大家阐明一点就是,每道算法题都有多种解法,我们只讲LeetCode上几种优秀的解题思路~,希望
可以帮助到大家,那我们先来看下题目描述吧~
一、题目描述:
请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
二、思路分析:
我们可以发现,回文链表即链表两端对应的位置的值相同,因此我们可以使用双指针法来比较两端的元素,并向中间移动,然而链表中只保存一个值和指向下一个节点的指针,要想得到某个特定索引位置的值,需要O(N)的时间,而数组列表使用数组存储,我们可以通过索引在O(1) 的时间访问列表任何位置的值;因此我们可以将链表的值复制到数组列表中,再使用双指针法判
三、代码实现
public boolean isPalindrome(ListNode head) {
//这里使用list,使用了list是有序的特性
List<Integer> vals = new ArrayList<Integer>();
// 将链表的值复制到数组中
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;
}
刷题总结
如果大家还有其他解题思路,只要能实现要求,都是没问题的,条条大路通罗马,不要仅仅局限于我讲的这种解法哈~,优秀的思路和代码更具备学习意义,我们一起加油吧