forked from mohitjain/leetcode_solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path234_palindrome_linked_list.rb
More file actions
65 lines (54 loc) · 1.38 KB
/
234_palindrome_linked_list.rb
File metadata and controls
65 lines (54 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Leetcode Problem: https://leetcode.com/problems/palindrome-linked-list/
# Given a singly linked list, determine if it is a palindrome.
#
# Example 1:
#
# Input: 1->2
# Output: false
#
# Example 2:
#
# Input: 1->2->2->1
# Output: true
#
# Follow up:
# Could you do it in O(n) time and O(1) space?
# ----------------------------------------------------------------------------------------------------------------------
# Definition for singly-linked list.
# class ListNode
# attr_accessor :val, :next
# def initialize(val = 0, _next = nil)
# @val = val
# @next = _next
# end
# end
# @param {ListNode} head
# @return {Boolean}
require_relative '../core/linked_list'
def is_palindrome(head)
slow_pointer = head
fast_pointer = head
while !fast_pointer.nil? && !fast_pointer.next.nil?
slow_pointer = slow_pointer.next
fast_pointer = fast_pointer.next.next
end
mid = fast_pointer.nil? ? slow_pointer : slow_pointer.next
# Reverse second half
previous = nil
new_head = mid
until new_head.nil?
next_element = new_head.next
new_head.next = previous
previous = new_head
new_head = next_element
end
while !previous.nil? && !head.nil?
return false if previous.val != head.val
previous = previous.next
head = head.next
end
true
end
list = LinkedList.new [1, 2]
is_palindrome list.head
list = LinkedList.new [1, 2, 2, 1]