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
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