Skip to main content

Delete all even parity nodes from circular linked list in golang

Go program for Delete all even parity nodes from circular linked list. Here problem description and explanation.

package main
import "fmt"
// Go program for
// Remove all even parity nodes from a circular single linked list
type LinkNode struct {
	data int
	next * LinkNode
}
func getLinkNode(data int) * LinkNode {
	// return new LinkNode
	return &LinkNode {
		data,
		nil,
	}
}
type CircularLinkedList struct {
	head * LinkNode
	tail * LinkNode
}
func getCircularLinkedList() * CircularLinkedList {
	// return new CircularLinkedList
	return &CircularLinkedList {
		nil,
		nil,
	}
}
func(this *CircularLinkedList) insert(value int) {
	var node * LinkNode = getLinkNode(value)
	if this.head == nil {
		this.head = node
	} else {
		this.tail.next = node
	}
	node.next = this.head
	this.tail = node
}
// Display node element of circular linked list
func(this CircularLinkedList) display() {
	if this.head == nil {
		fmt.Println("\n Empty Linked List")
	} else {
		fmt.Print("\n Linked List Element \n")
		// First node of linked list
		fmt.Print("  ", this.head.data)
		var temp * LinkNode = this.head.next
		// Display linked list node
		for (temp != nil && temp != this.head) {
			// Display node value
			fmt.Print("  ", temp.data)
			// Visit to next node
			temp = temp.next
		}
	}
}
// Handles the request to find set bits in given integer
func(this CircularLinkedList) coutSetBit(num int) int {
	var result int = num
	result = result - ((result >> 1) & 1431655765)
	result = (result & 858993459) + ((result >> 2) & 858993459)
	result = (result + (result >> 4)) & 252645135
	result = result + (result >> 8)
	result = result + (result >> 16)
	result = result & 63
	return result
}
func(this *CircularLinkedList) removeNode() {
	if this.head == nil {
		return
	}
	var temp * LinkNode = this.head
	var auxiliary * LinkNode = this.head
	var point * LinkNode = nil
	for (temp != nil) {
		if this.coutSetBit(temp.data) % 2 == 0 {
			auxiliary = temp
			// Visit to next node
			temp = temp.next
			if auxiliary == this.head {
				// Remove head node
				if auxiliary == this.tail {
					// Removing a single node
					this.tail = nil
					this.head = nil
					temp = nil
				} else {
					this.head = temp
					this.tail.next = temp
				}
			} else if auxiliary == this.tail {
				if point != nil {
					// When Remove last node
					point.next = this.head
				}
				this.tail = point
			} else {
				if point != nil {
					// When Remove last node
					point.next = temp
				}
			}
			auxiliary = nil
		} else {
			point = temp
			// Visit to next node
			temp = temp.next
			if temp == this.head {
				// Stop the process
				temp = nil
			}
		}
	}
}
func main() {
	var cll * CircularLinkedList = getCircularLinkedList()
	// Insert node
	cll.insert(3)
	cll.insert(12)
	cll.insert(32)
	cll.insert(14)
	cll.insert(27)
	cll.insert(19)
	cll.insert(1)
	cll.insert(18)
	fmt.Print("\n Before Remove ")
	cll.display()
	/*
	    Node  Binary     Even Parity
	     3     (11)         Yes
	    12     (1100)       Yes
	    32     (100000)     No
	    14     (1110)       No
	    27     (11011)      Yes
	    19     (10011)      No
	    1         (1)       No        
	    18     (10010)      Yes
	*/
	cll.removeNode()
	fmt.Print("\n\n After Remove")
	cll.display()
}

Output

 Before Remove
 Linked List Element
 3  12  32  14  27  19  1  18

 After Remove
 Linked List Element
 32  14  19  1




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