linked-list가 회문이면 true, 아니면 false를 반환.
(좌우대칭?)
fast slow pointer를 이용해서 가운데 값을 알 수 있다.
그럼 마지막 포인터에서 거꾸로 가운데 값을 향해서 오면서 계속 같으면 회문이라 볼 수 있고 true를 반환한다.
// * 가운데를 중심으로 나눠서 뒤에 있는 linked-list를 revers 함수를 이용해 같은지 확인.
const reverseList = (head) => {
let cur = head;
let prev = null;
let next;
while (cur) {
next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
// * Main
const isPalindrome = (head) => {
let fast = head;
let slow = head;
let startPointer = head;
let length = 0;
while (fast && fast.next) {
fast = fast.next.next;
slow = slow.next;
length++;
}
let mid = reverseList(slow);
while(length) {
length--;
if (mid.val !== startPointer.val) return false;
mid = mid.next;
startPointer = startPointer.next;
}
return true;
};