# Node class for a singly linked list
class ListNode
attr_accessor :value, :next
def initialize(value)
@value = value # data stored in the node
@next = nil # reference to the next node
end
end
# Reverse the linked list in-place
def reverse_list(head)
prev = nil # will become the new head
current = head # pointer to traverse the list
while current
next_node = current.next # save next node
current.next = prev # reverse the link
prev = current # move prev forward
current = next_node # move current forward
end
prev # prev is the new head
end
# Print the linked list
def print_list(head)
temp = head
while temp
print temp.value
print " -> " if temp.next
temp = temp.next
end
puts
end
# Build a sample list: 1 -> 2 -> 3 -> 4 -> 5
head = ListNode.new(1)
head.next = ListNode.new(2)
head.next.next = ListNode.new(3)
head.next.next.next = ListNode.new(4)
head.next.next.next.next = ListNode.new(5)
puts "Original list:"
print_list(head)
# Reverse the list
head = reverse_list(head)
puts "Reversed list:"
print_list(head)
=begin
run:
Original list:
1 -> 2 -> 3 -> 4 -> 5
Reversed list:
5 -> 4 -> 3 -> 2 -> 1
=end