编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
解:什么是回文:正着看和倒着看数据元素都是一样的就是回文,在数组和链表中都有判断是否是回文的题目。
在本题中判断链表是否是回文有多个方法:
1、链表转数组,反转,判相等
2、直接反转链表,在原链表比较,判相等(长度不等|元素不等都表示不等)
3、链表反转一半,判相等(这个方法我现在还不会,比较菜~)
解法1:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
var arr=[];
while(head){
arr.push(head.val);
head=head.next;
}
return arr.toString() === arr.reverse().toString();
};
toString()方法是为了可以直接打印数组,让数组元素以元素的形式输出,如果直接输出数组/链表中的元素,是不能输出的,需要循环遍历,因此在数组和链表中都有toString() 方法。
解法2:链表头插法
新建一个链表,每次在头部插入元素,全部插入后,形成的心链表就是原来的倒序,然后在反转。
var cur=head;
var lists=null; //新链表
while(cur){
var node=new ListNode(cur.val); //新建节点,改节点元素为当前元素(原链表中元素)
//头插法
node.next=lists;
lists=node;
cur=cur.next;
}
var originCur=head; //保存原链表中head
var revCur=lists; //心链表
while(originCur && revCur){ //二者都不为空
if(originCur.val===revCur.val){
originCur=originCur.next;
revCur=revCur.next;
}
break;
}
if(originCur && revCur){
return false;
}
return true;