연결 리스트가 팰린드롬 구조인지 판별하라
입력 :
1->2
출력 :
false
입력 :
1->2->2->1
출력 :
true
from typing import List
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
node_2 = ListNode(2)
node_1 = ListNode(1, node_2)
node_6 = ListNode(1)
node_5 = ListNode(2, node_6)
node_4 = ListNode(2, node_5)
node_3 = ListNode(1, node_4)
def isPalindrome(head: ListNode) -> bool:
checker = []
cur = head
while cur:
checker.append(cur.val)
cur = cur.next
return checker == checker[::-1]
isPalindrome(node_1)
False
isPalindrome(node_3)
[1] [1, 2] [1, 2, 2] [1, 2, 2, 1]
True
Accepted 64 ms 24.5 MB python3
def isPalindrome(head: ListNode) -> bool:
q = []
if not head:
return True
node = head
while node is not None:
q.append(node.val)
node = node.next
while len(q) > 1:
if q.pop(0) != q.pop():
return False
return True
isPalindrome(node_1)
False
isPalindrome(node_3)
True
Accepted 172 ms 24.1 MB python3
import collections
def isPalindrome(head: ListNode) -> bool:
q = collections.deque()
if not head:
return True
node = head
while node is not None:
q.append(node.val)
node = node.next
while len(q) > 1:
if q.popleft() != q.pop():
return False
return True
isPalindrome(node_1)
False
isPalindrome(node_3)
True
Accepted 72 ms 24.3 MB python3
고 모름
def isPalindrome(head: ListNode) -> bool:
rev = None
slow = fast = head
while fast and fast.next:
fast = fast.next.next
rev, rev.next, slow = slow, rev, slow.next
if fast:
slow = slow.next
while rev and rev.val == slow.val:
slow, rev = slow.next, rev.next
return not rev
isPalindrome(node_1)
False
isPalindrome(node_3)
True
Accepted 72 ms 24.3 MB python3