【LeetCode 234】算法:回文链表
题目:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
提示:链表中节点数目在范围[1, 105] 内; 0 <= Node.val <= 9

这个题目有很多种解决方法,这里介绍我认为最简单的一个方法:使用 List 集合
算法步骤:
1. 遍历链表:首先遍历整个链表,将所有节点的值存储到 List 中。
2. 比较元素:然后使用两个指针从 List 的两端开始,向中间逐个比较元素,如果所有元素都相同,则链表是回文的。
3. 返回结果:根据比较结果返回 true 或 false。
复杂度分析:
-
时间复杂度:O (n),其中 n 是链表的长度。因为需要遍历整个链表来填充 List,然后再次遍历 List 的一半来比较元素。
-
空间复杂度:O (n),需要额外的空间来存储链表的所有元素。
这种方法的优点是代码简单易懂,但缺点是效率较低,尤其是对于大型链表。如果对性能有较高要求,应该使用直接操作链表节点的方法。
我的 Java 代码:
/**
* 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) {
List<Integer> list = new ArrayList<>();
while(head != null){
list.add(head.val);
head = head.next;
}
// i和j 初始为集合的头尾元素
for(int i=0,j=list.size()-1; i<j; i++,j--){
if(list.get(i) != list.get(j)){
return false;
}
}
return true;
}
}
所有正文内容皆为本人原创,禁止搬运

浙公网安备 33010602011771号