주어진 링크드 리스트가 회문인지 판별하는 문제이다.
무작정 head.length를 쓰려니 undefined가 나와서 당황했는데, 당연함.
array가 아니라 말그대로 링크드 리스트가 들어왔기 때문이다.
그래서 링크드 리스트를 array로 바꿔주고 시작했다.
Python이었으면 왼쪽, 오른쪽 반씩 슬라이싱하고 equal check를 하는 게 한 줄 정도면 끝났겠지만 JavaScript로는? 어림도 없다. 일일이 다 해줘야 함.
var isPalindrome = function(head) {
// array로 바꿔주기 위해 전체 크기 구하기
function nodeNumber(node){
if (node.next === null){
return 0
}
let countNode = 1
while (node.next) {
node = node.next
countNode += 1
}
return countNode
}
listLength = nodeNumber(head)
nodeToArray = []
let currentNode = head
// 링크드 리스트 nodeToArray에 넣어주기
for (let i=0;i<listLength;i++){
nodeToArray.push(currentNode.val)
currentNode = currentNode.next
}
// 홀짝에 따라 반으로 나눠주고 뒤집어 주기
let mid = listLength%2 == 0 ? listLength/2 : Math.floor(listLength/2)
const left = nodeToArray.slice(0, mid)
const right = listLength%2 == 0 ? nodeToArray.slice(mid, listLength).reverse() :nodeToArray.slice(mid+1, listLength).reverse()
/* example
[1, 2, 2, 1] -> [1, 2], [1, 2]
[1, 2, 3, 2, 1] -> [1, 2], [1, 2]
[1, 2, 3, 3, 2] -> [1, 2], [2, 3]
*/
// ⭐️⭐️서로 같은 array인지 판별하기⭐️⭐️
function arrayEquals(a, b) {
return Array.isArray(a) &&
Array.isArray(b) &&
a.length === b.length &&
a.every((val, index) => val === b[index]);
}
return arrayEquals(left, right)
};
a === b
로 판별하면 안된다!! function arrayEquals(a, b) {
return Array.isArray(a) &&
Array.isArray(b) &&
a.length === b.length &&
a.every((val, index) => val === b[index]);
}