题目:给你一个单链表的头节点 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;}
}