Skip to main content

Anticlockwise spiral conversion of doubly linked list in golang

Go program for Anticlockwise spiral conversion of doubly linked list. Here problem description and other solutions.

package main
import "fmt"
// Go program for
// Convert a doubly linked list anticlockwise spiral form

// This is Linked List Node
type LinkNode struct {
	data int
	next * LinkNode
	prev * LinkNode
}
func getLinkNode(data int) * LinkNode {
	// return new LinkNode
	return &LinkNode {
		data,
		nil,
		nil,
	}
}
type DoublyLinkedList struct {
	head * LinkNode
	tail * LinkNode
}
func getDoublyLinkedList() * DoublyLinkedList {
	// return new DoublyLinkedList
	return &DoublyLinkedList {
		nil,
		nil,
	}
}
// Insert new node at end position
func(this *DoublyLinkedList) insert(value int) {
	// Create a node
	var node * LinkNode = getLinkNode(value)
	if this.head == nil {
		// Add first node
		this.head = node
		this.tail = node
		return
	}
	// Add node at last position
	this.tail.next = node
	node.prev = this.tail
	this.tail = node
}
// Display node element of doubly linked list
func(this DoublyLinkedList) display() {
	if this.head == nil {
		fmt.Println("Empty Linked List")
	} else {
		fmt.Print("Linked List Head to Tail :")
		// Get first node of linked list
		var temp * LinkNode = this.head
		// iterate linked list 
		for (temp != nil) {
			// Display node value
			fmt.Print("  ", temp.data)
			// Visit to next node
			temp = temp.next
		}
		fmt.Print("\nLinked List Tail to Head :")
		// Get last node of linked list
		temp = this.tail
		// iterate linked list 
		for (temp != nil) {
			// Display node value
			fmt.Print("  ", temp.data)
			// Visit to prev node
			temp = temp.prev
		}
	}
}
func(this *DoublyLinkedList) spiralTransform() {
	if this.head == nil || this.head.next == nil {
		return
	}
	var last * LinkNode = this.tail
	var current * LinkNode = this.head
	var auxiliary * LinkNode = nil
	var temp * LinkNode = nil
	var back * LinkNode = nil
	// Set new head
	this.head = this.tail
	for (current != nil && last != nil) {
		if current == last {
			current.next = nil
			current.prev = back
			this.tail = current
			// Set new last node
			return
		} else if current.next == last {
			current.next = nil
			current.prev = last
			last.next = current
			last.prev = back
			// Set new last node
			this.tail = current
			return
		}
		// Swap link
		auxiliary = current.next
		temp = last.prev
		current.prev = last
		last.next = current
		current.next = temp
		last.prev = back
		back = current
		current = auxiliary
		last = temp
	}
}
func main() {
	var dll * DoublyLinkedList = getDoublyLinkedList()
	// Insert following linked list nodes
	dll.insert(1)
	dll.insert(2)
	dll.insert(3)
	dll.insert(4)
	dll.insert(5)
	dll.insert(6)
	dll.insert(7)
	dll.insert(8)
	dll.insert(9)
	fmt.Println("\nBefore anticlockwise spiral conversion")
	// Display all node
	dll.display()
	fmt.Println("\nAfter anticlockwise spiral conversion")
	dll.spiralTransform()
	dll.display()
}

Output

Before anticlockwise spiral conversion
Linked List Head to Tail :  1  2  3  4  5  6  7  8  9
Linked List Tail to Head :  9  8  7  6  5  4  3  2  1
After anticlockwise spiral conversion
Linked List Head to Tail :  9  1  8  2  7  3  6  4  5
Linked List Tail to Head :  5  4  6  3  7  2  8  1  9




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