给你一个单链表的头节点 head,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 false。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
**提示:**链表中节点数目在范围 [1, 10^5] 内,0 <= Node.val <= 9
题目解读
回文链表:本质是单链表的一种特殊结构 —— 从链表头部到尾部遍历得到的节点值序列,和从尾部到头部遍历得到的序列完全一致,比如 "abba"、"12321",正读和反读都相同。我们往往使用这'对称性'解决问题。
思路一
将链表转换为数组后使用双指针判断是否是回文。
具体步骤与解析
1. 统计链表长度
int len = 0; // 用以储存链表长度
ListNode cur = head; // 从头节点出发
while (cur != null) {
len++; // 每遍历一个节点,长度 +1
cur = cur.next; // 游标后移
}
作用:确定后续数组的长度,避免数组越界或浪费空间。
2. 将链表值存入数组
cur = head; // 重置游标,回到链表头
int[] res = new int[len]; // 根据长度创建数组
for (int i = 0; i < res.length; i++) {
res[i] = cur.val; // 存入当前节点值
cur = cur.next; // 游标后移
}
注意:这里 for 循环的终止条件是 i < res.length,和链表长度完全匹配,不会遗漏或越界。
3. 双指针判断回文
for (int i = 0, j = len - ; i < j; i++, j--) {
(res[i] != res[j]) {
;
}
}
;

