题目
给你一个单链表的头节点
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 };