回文链表
一、LeetCode题解
瞧一瞧~
- 博健的LeetCode题解:Gitbook版本传送门
- 博健的LeetCode题解:CSDN传送门
- 前端进阶笔记:Gitbook传送门
二、算法题
题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
解法一(快慢指针+反转链表)
思路
- 利用快慢指针确定链表的中间位置;
- 将链表的前半部分进行反转,与链表的后半部分进行比对;
代码
var isPalindrome = function(head) {
if(!head || !head.next) return true;
var slow = head // 慢指针
var fast = head // 快指针
var prev = null // 保存上一个节点
var temp = null // 保存下一个节点
while(fast && fast.next){
fast = fast.next.next // 快指针走2个节点
temp = slow.next // 慢指针走过得链表直接反转
slow.next = prev
prev = slow
slow = temp // 慢指针走1个节点
}
if(fast){ // 奇数个节点的链表
slow = slow.next
}
while(slow){
if(slow.val !== prev.val) return false;
slow = slow.next
prev = prev.next
}
return true
};
结果
解法二(辅助数组+双指针)
思路
- 将链表数据转换成数字;
- 双指针,一个在头,一个在尾对应比较;
代码
var isPalindrome = function(head) {
if(!head || !head.next) return true; //边界判断
var arr = []
while(head){
arr.push(head.val)
head = head.next
} //获取节点数组
var left = 0, right = arr.length-1
while(left < right){
if(arr[left] !== arr[right]) return false
left++
right--
}
return true
};