From 745e85961978b2ec3db858b7b72014d92d61c81e Mon Sep 17 00:00:00 2001 From: SohanR09 Date: Tue, 6 Oct 2020 01:05:46 +0530 Subject: [PATCH 1/3] Reverse link list --- Ruby/Reverse.rb | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Ruby/Reverse.rb diff --git a/Ruby/Reverse.rb b/Ruby/Reverse.rb new file mode 100644 index 0000000..f18c985 --- /dev/null +++ b/Ruby/Reverse.rb @@ -0,0 +1,35 @@ +class LinkedListNode + attr_accessor :value, :next_node + + def initialize(value, next_node=nil) + @value = value + @next_node = next_node + end + end + + def print_values(list_node) + print "#{list_node.value} --> " + if list_node.next_node.nil? + print "nil\n" + return + else + print_values(list_node.next_node) + end + end + def reverse_list(list, previous=nil) + current_head = list.next_node + list.next_node = previous + if current_head + reverse_list(current_head, list) + else + list + end + end + + node1 = LinkedListNode.new(37) + node2 = LinkedListNode.new(99, node1) + node3 = LinkedListNode.new(12, node2) + print_values(node3) + puts "-------" + revlist = reverse_list(node3) + print_values(revlist) \ No newline at end of file From e2c32e28642718efdd3d5523fdafe3a20aadaf24 Mon Sep 17 00:00:00 2001 From: Sohan Rathod <68809812+SohanR09@users.noreply.github.com> Date: Sun, 11 Oct 2020 22:21:32 +0530 Subject: [PATCH 2/3] Updated Reverse link list Updated the file code by resolving the errors caused earlier. --- Ruby/Reverse.rb | 137 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 111 insertions(+), 26 deletions(-) diff --git a/Ruby/Reverse.rb b/Ruby/Reverse.rb index f18c985..5ebbd54 100644 --- a/Ruby/Reverse.rb +++ b/Ruby/Reverse.rb @@ -1,35 +1,120 @@ -class LinkedListNode - attr_accessor :value, :next_node +class Node + attr_accessor :node, :next - def initialize(value, next_node=nil) - @value = value - @next_node = next_node - end + def initialize(node) + @node = node end +end + +#### +# add - inserts the specified element at the specified position, returns true on success +# addLast - inserts the specified element at the end of the list +# remove - removes specified element, returns true on success +# removeAt - removes element at specified index +# clear - remove all elements +# print - print elements in list +# reverse - reverses the linkedlist +#### +class LinkedList + attr_accessor :head - def print_values(list_node) - print "#{list_node.value} --> " - if list_node.next_node.nil? - print "nil\n" - return + def initialize(val) + @head = Node.new(val) + end + + def add(val) + current = @head + + while current.next != nil + current = current.next + end + current.next = Node.new(val) + end + + def add_at(val, pos) + current = @head + previous = nil + if pos == 0 + new_head = Node.new(val) + new_head.next = @head + @head = new_head else - print_values(list_node.next_node) + (0...pos).each do |i| + return false if current.nil? + previous = current + current = current.next + end + next_node = Node.new(val) + previous.next = next_node + next_node.next = current + end + return true + end + + def remove(val) + current = @head + temp = nil + previous = nil + while current != nil + if current.node == val + temp = current.next + previous.next = temp + return true + else + previous = current + current = current.next + end end + + return false end - def reverse_list(list, previous=nil) - current_head = list.next_node - list.next_node = previous - if current_head - reverse_list(current_head, list) + + def remove_at(pos) + current = @head + previous = nil + if pos == 0 + temp = @head.next + @head = temp else - list + (0...pos).each do + return false if current.nil? + previous = current + current = current.next + end + previous.next = current.next end + + return true end - - node1 = LinkedListNode.new(37) - node2 = LinkedListNode.new(99, node1) - node3 = LinkedListNode.new(12, node2) - print_values(node3) - puts "-------" - revlist = reverse_list(node3) - print_values(revlist) \ No newline at end of file + + def clear + @head.node = nil + @head.next = nil + end + + def print + msg = '' + temp = nil + current = @head + while current != nil + msg << "#{current.node} -> " + current = current.next + end + + return msg[0..-4] + end + + def reverse + previous = nil + current = @head + + while current != nil + next_node = current.next + current.next = previous + previous = current + current = next_node + end + + @head = previous + end +end From e5db3deb4d7ad55378ad6f79c706df8b6fd4a781 Mon Sep 17 00:00:00 2001 From: Sohan Rathod <68809812+SohanR09@users.noreply.github.com> Date: Sun, 11 Oct 2020 22:26:02 +0530 Subject: [PATCH 3/3] Updated file Reverse Link list --- Ruby/Reverse.rb | 140 ++++++++++-------------------------------------- 1 file changed, 28 insertions(+), 112 deletions(-) diff --git a/Ruby/Reverse.rb b/Ruby/Reverse.rb index 5ebbd54..f094215 100644 --- a/Ruby/Reverse.rb +++ b/Ruby/Reverse.rb @@ -1,120 +1,36 @@ -class Node - attr_accessor :node, :next - - def initialize(node) - @node = node - end -end - -#### -# add - inserts the specified element at the specified position, returns true on success -# addLast - inserts the specified element at the end of the list -# remove - removes specified element, returns true on success -# removeAt - removes element at specified index -# clear - remove all elements -# print - print elements in list -# reverse - reverses the linkedlist -#### -class LinkedList - attr_accessor :head - - def initialize(val) - @head = Node.new(val) - end - - def add(val) - current = @head - - while current.next != nil - current = current.next - end - current.next = Node.new(val) - end - - def add_at(val, pos) - current = @head - previous = nil - if pos == 0 - new_head = Node.new(val) - new_head.next = @head - @head = new_head - else - (0...pos).each do |i| - return false if current.nil? - previous = current - current = current.next - end - next_node = Node.new(val) - previous.next = next_node - next_node.next = current - end - return true - end - - def remove(val) - current = @head - temp = nil - previous = nil - while current != nil - if current.node == val - temp = current.next - previous.next = temp - return true - else - previous = current - current = current.next - end - end +class LinkedListNode + attr_accessor :value, :next_node - return false - end - - def remove_at(pos) - current = @head - previous = nil - if pos == 0 - temp = @head.next - @head = temp - else - (0...pos).each do - return false if current.nil? - previous = current - current = current.next - end - previous.next = current.next - end - - return true + def initialize(value, next_node=nil) + @value = value + @next_node = next_node end +end - def clear - @head.node = nil - @head.next = nil +def reverse_list(list, previous=nil) + if list + next_node = list.next_node + list.next_node = previous + reverse_list(next_node, list) end +end - def print - msg = '' - temp = nil - current = @head - while current != nil - msg << "#{current.node} -> " - current = current.next - end - - return msg[0..-4] +def print_values(list_node) + if list_node + print "#{list_node.value} --> " + print_values(list_node.next_node) + else + print "nil\n" + return end +end - def reverse - previous = nil - current = @head - - while current != nil - next_node = current.next - current.next = previous - previous = current - current = next_node - end +node1 = LinkedListNode.new(37) +node2 = LinkedListNode.new(99, node1) +node3 = LinkedListNode.new(12, node2) +node4 = LinkedListNode.new(54, node3) - @head = previous - end -end +print_values(node4) +puts "---------" +reverse_list(node4) +print_values(node1)