234. 回文链表 / 面试题 02.06. 回文链表
原题链接:234. 回文链表 / 面试题 02.06. 回文链表
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
}
解题思路:
① 数组+双指针: 方法容易理解 但是执行时间及空间效率不及方法②
- 定义一个新数组,用push方法将链表的值依次存入
- 利用头尾双指针,通过条件判断,一个向前移,一个向后移
var isPalindrome = function(head) {
let vals=[];
while(head!=null){
//将所有的值存入数组当中
vals.push(head.val);
head=head.next;
}
// 定义双指针 一个不断后移,一个不断前移
let i=0;
let j=vals.length-1;
while(i<j){
if(vals[i]!=vals[j]){
return false;
}
i++;
j--;
}
return true;
}
② 反转链表+双指针:执行时间和内存效率更高
- 定义查找中间结点函数,通过快慢双指针完成。如果是奇数结点 则为最中间 如果是偶数结点 则为前半部分最后一个结点
- 定义反转链表函数,具体思路详解:【LeetCode】 JavaScript实现 反转链表(三种思路)
- 依次调用后,进行判断,利用双指针,一个从头开始,一个从中间开始,不断后移
var isPalindrome = function(head) {
let half=halflist(head); //找到找到前半部分的尾结点
let halfhead=reverlist(half