diff --git a/linked-list-circular-2-traversal/linked-list-circular-2-traversal.go b/linked-list-circular-2-traversal/linked-list-circular-2-traversal.go index e69de29..82c2130 100644 --- a/linked-list-circular-2-traversal/linked-list-circular-2-traversal.go +++ b/linked-list-circular-2-traversal/linked-list-circular-2-traversal.go @@ -0,0 +1,84 @@ +// ==================================================== +// Data-Structures-with-Go Copyright(C) 2017 Furkan Türkal +// This program comes with ABSOLUTELY NO WARRANTY; This is free software, +// and you are welcome to redistribute it under certain conditions; See +// file LICENSE, which is part of this source code package, for details. +// ==================================================== + +package main + +import "fmt" + +type Node struct { + data int + next *Node +} + +//Returns an initialized list +func (n *Node) Init() *Node { + n.data = -1 + return n +} + +//Returns an new list +func New() *Node { + return new(Node).Init() +} + +//Returns the first node in list +func (n *Node) Next() *Node { + return n.next +} + +//Returns the last node in list if exist, otherwise returns current +func (n *Node) Back() *Node { + current := n.next + for current != nil && current.next != nil { + current = current.next + } + return current +} + +//This function prints contents of linked list starting from the given node +func printList(n *Node) { + for n != nil { + fmt.Println(n.data) + n = n.next + } +} + +func Push(head_ref **Node, new_data int) { + //1. Allocate new node + new_node := New() + temp := *head_ref + + new_node.data = new_data + new_node.next = *head_ref + + //2. If linked list is not NULL then set the next of last node + if *head_ref != nil { + for temp.next != *head_ref { + temp = temp.next + } + temp.next = new_node + } else { + //For the fist node + new_node.next = new_node + } + //4. Move the head to point to new_node + *head_ref = new_node +} + +func main() { + //Start with the empty list + head := New() + + Push(&head, 12) + Push(&head, 56) + Push(&head, 2) + Push(&head, 11) + + fmt.Println("Created Circular LinkedList is: ") + + printList(head) +}