开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
题目
给你一个单链表的头节点
head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。
输入: head = [1,2,2,1]
输出: true
思路一
我们这里可以根据栈先进后出的特性来判断是否是回文链表,先声明一个stack变量,它是一个空栈,然后再声明一个cur变量,它指向当前的head形参,然后使用循环进行判断,当前的cur变量不为null则一直进行循环,然后将当前的cur变量通过push方法添加到stack栈中,然后将cur变量的值变为cur.next,然后再进行循环,这次判断的是head形参,如果形参不为null则一直进行循环,再循环中判断当前head的val属性和stack栈中的最后一个元素的val属性是否相等,如果不相等的情况下则直接返回false,如果相等则将head形参的值改为head.next,如果最后都没有返回false,则说明是回文链表,这个时候直接返回true即可
function isPalindrome(head) {
const stack = [];
let cur = head;
while (cur !== null) {
stack.push(cur);
cur = cur.next;
}
while (head !== null) {
if (head.val !== stack.pop().val) {
return false;
}
head = head.next;
}
return true;
}
思路二
我们这里还可以使用快慢指针的方式进行实现,首先当前的head是否存在,如果不存在直接返回false即可,然后声明一个slow和fast变量,他们两个都指向head形参,然后再声明两个变量,分别是cur和pre变量,cur变量指向当前要反转的节点,pre变量指向cur变量的前一个节点,然后进行循环,通过循环去查找到中点,然后将当前节点指向前一个节点,前一个节点后移 ,当前节点后移,做出反转的操作,然后判断fast变量,当fast不为null时,说明链表长度为奇数,应该跳过中心节点,然后再使用循环,在循环中将pre变量指向反转链表的头, slow变量指向后半部分链表的头,在进行开始进行比较,如果不是回文链表的情况下则直接返回false,当循环执行完毕如果还没有返回false,则直接返回true
var isPalindrome = function(head) {
if (!head) return false
let slow = head, fast = head;
let cur = head, pre = null;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
cur.next = pre;
pre = cur;
cur = slow;
}
if (fast !== null){
slow = slow.next
}
while (slow != null && pre != null) {
if (slow.val !== pre.val) {
return false
}
slow = slow.next;
pre = pre.next;
}
return true
};