Skip to main content

Rotate linked list clockwise by k nodes in ruby

Rotating linked list node clockwise

Ruby program for Rotate linked list clockwise by k nodes. Here mentioned other language solution.

#  Ruby program for 
#  Rotate a list by moving each element 
#  k times to the right.
#  Or clockwise rotation of linked list 

#  Linked list node
class LinkNode 
	# Define the accessor and reader of class LinkNode
	attr_reader :data, :next
	attr_accessor :data, :next
	def initialize(data) 
		self.data = data
		self.next = nil
	end
end

class SingleLL 
	# Define the accessor and reader of class SingleLL
	attr_reader :head, :tail
	attr_accessor :head, :tail
	def initialize() 
		self.head = nil
		self.tail = nil
	end

	#  Add new Node at end of linked list 
	def addNode(data) 
		node = LinkNode.new(data)
		if (self.head == nil) 
			self.head = node
		else
			#  Append the node at last position
			self.tail.next = node
		end
		self.tail = node
	end

	#  Display linked list element
	def display() 
		if (self.head == nil) 
			print("\n Empty linked list\n")
			return
		end

		temp = self.head
		#  iterating linked list elements
		while (temp != nil) 
			print(" " + temp.data.to_s + " →")
			#  Visit to next node
			temp = temp.next
		end
		print(" NULL\n")
	end

	#  This are perform the linked list rotation
	def rotation(k) 
		#  Define some auxiliary variable
		auxiliary = self.head
		count = 0
		#  Count number of node in linked list
		while (auxiliary != nil) 
			#  visit to next node
			auxiliary = auxiliary.next
			count += 1
		end
		if (count <= 1) 
			#  When have less than 2 nodes in linked list
			return
		end

		#  Get actual rotation
		count = k % count
		if (count == 0) 
			#  When actual linked list are not affected
			return
		end

		auxiliary = self.head
		#  Find the rotational node
		while (count > 1) 
			#  Visit to next node
			auxiliary = auxiliary.next
			count -= 1
		end

		#  Connecting the last node to first node of linked list
		self.tail.next = self.head
		#  Set new last node
		self.tail = auxiliary
		#  Set new head
		self.head = auxiliary.next
		#  Set that there is no node after of tail
		self.tail.next = nil
	end

	#  Handles the request to perform rotation
	#  k is indicate node rotation
	def clockwiseRotation(k) 
		if (k <= 0) 
			#  When invalid given k
			return
		end
		if (self.head == nil) 
			print("\n Empty Linked List\n")
			return
		end

		#  Display given linked list
		print(" Before rotate \n")
		print(" Linked List : \n")
		self.display()
		print(" Given k : " + k.to_s, "\n")
		#  Perform rotation
		self.rotation(k)
		#  Display resultant linked list
		print(" After rotate \n")
		print(" Linked List : \n")
		self.display()
		print("\n\n")
	end

end

def main() 
	sll1 = SingleLL.new()
	sll2 = SingleLL.new()
	#  First linked list
	#  1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → NULL
	sll1.addNode(1)
	sll1.addNode(2)
	sll1.addNode(3)
	sll1.addNode(4)
	sll1.addNode(5)
	sll1.addNode(6)
	sll1.addNode(7)
	sll1.addNode(8)
	#  Second linked list
	#  4 → 9 → 7 → 3 → 8 → 6 → -2 → NULL
	sll2.addNode(4)
	sll2.addNode(9)
	sll2.addNode(7)
	sll2.addNode(3)
	sll2.addNode(8)
	sll2.addNode(6)
	sll2.addNode(-2)
	#  Test case
	sll1.clockwiseRotation(3)
	sll2.clockwiseRotation(18)
end

main()

Output

 Before rotate 
 Linked List : 
 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → NULL
 Given k : 3
 After rotate 
 Linked List : 
 4 → 5 → 6 → 7 → 8 → 1 → 2 → 3 → NULL


 Before rotate 
 Linked List : 
 4 → 9 → 7 → 3 → 8 → 6 → -2 → NULL
 Given k : 18
 After rotate 
 Linked List : 
 8 → 6 → -2 → 4 → 9 → 7 → 3 → NULL






Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment