linklist

Run Settings
LanguageGo
Language Version
Run Command
package main import ( "fmt" ) type Node struct { value int next *Node } func NewNode(val int) Node { return Node{value: val, next : nil} } type MyLinklist struct{ head *Node tail *Node length int } func NewLinklist(value int) MyLinklist { newNode := NewNode(value) return MyLinklist{ head: &newNode, tail: &newNode, length: 1} } func (list *MyLinklist) append(value int) MyLinklist { newNode := NewNode(value) list.tail.next = &newNode list.tail = &newNode list.length++ return *list } func (list *MyLinklist) prepend(value int) MyLinklist { newNode := Node{value: value, next : nil} newNode.next = list.head list.head = &newNode list.length++ return *list } func (list *MyLinklist) insert(index, value int) (MyLinklist, error) { if index < 0 || index > list.length { return *list, fmt.Errorf("invalid input index should be in 0 and %d", list.length) } if index == 0 { return list.prepend(value), nil } else if index == list.length { return list.append(value), nil } //get leader node at index leader := list.traverseToIndexNode(index-1) newNode := NewNode(value) newNode.next = leader.next leader.next = &newNode list.length++ return *list, nil } func (list *MyLinklist) remove(index int) (MyLinklist, error) { if index < 0 || index > list.length { return *list, fmt.Errorf("invalid input index should be in 0 and %d", list.length) } if index == 0 { list.head = list.head.next return *list, nil } //get leader node leaderNode := list.traverseToIndexNode(index-1) fmt.Printf("\n remove node at %d , leader is : %v", index, leaderNode) nodeToRemove := leaderNode.next leaderNode.next = nodeToRemove.next return *list, nil } func (list *MyLinklist) reverse() MyLinklist { curr := list.head list.tail = list.head var prevNode *Node var nextNode *Node for curr != nil { nextNode = curr.next curr.next = prevNode prevNode = curr curr = nextNode } //At last point currHead to Prev list.head = prevNode return *list } //return node at index func(list *MyLinklist) traverseToIndexNode(index int) *Node { idxNode := list.head c := 0 for c < index { idxNode = idxNode.next c++ } return idxNode } func(list *MyLinklist) print() { head := list.head for head != nil { fmt.Printf("%d \t", head.value) head = head.next } } func main() { list := NewLinklist(5) list.append(12) list.append(10) list.prepend(15) list.prepend(1) list.print() _, err := list.remove(2) if err != nil { fmt.Println("insert error: ", err) } fmt.Println("\nafter remove node at index 2") list.print() _, err = list.insert(1, 100) if err != nil { fmt.Println("insert error: ", err) } fmt.Printf("\nafter insert node value %d at index %d \n", 100, 1) list.print() list.reverse() fmt.Println("\n reverse list") list.print() }
package main import ( "fmt" ) type Node struct { value int next *Node prev *Node } func NewNode(val int) Node { return Node{value: val, next : nil, prev : nil} } type MyDoubleLinklist struct{ head *Node tail *Node length int } func NewMyDoubleLinklist(value int) MyLinklist { newNode := NewNode(value) return MyLinklist{ head: &newNode, tail: &newNode, length: 1} } func (list *MyDoubleLinklist) append(value int) MyDoubleLinklist { currTailNode := list.tail newNode := NewNode(value) list.tail.next = &newNode list.tail = &newNode list.tail.prev = currTailNode list.length++ return *list } func (list *MyDoubleLinklist) prepend(value int) MyDoubleLinklist { newNode := NewNode(value) newNode.next = list.head list.head = &newNode list.length++ return *list } func (list *MyDoubleLinklist) insert(index, value int) (MyDoubleLinklist, error) { if index < 0 || index > list.length { return *list, fmt.Errorf("invalid input index should be in 0 and %d", list.length) } if index == 0 { return list.prepend(value), nil } else if index == list.length { return list.append(value), nil } //get leader node at index leader := list.traverseToIndexNode(index-1) newNode := NewNode(value) newNode.next = leader.next leader.next = &newNode list.length++ return *list, nil } func (list *MyDoubleLinklist) remove(index int) (MyDoubleLinklist, error) { if index < 0 || index > list.length { return *list, fmt.Errorf("invalid input index should be in 0 and %d", list.length) } if index == 0 { list.head = list.head.next return *list, nil } //get leader node leaderNode := list.traverseToIndexNode(index-1) fmt.Printf("\n remove node at %d , leader is : %v", index, leaderNode) nodeToRemove := leaderNode.next leaderNode.next = nodeToRemove.next return *list, nil } //return node at index func(list *MyDoubleLinklist) traverseToIndexNode(index int) *Node { idxNode := list.head c := 0 for c < index { idxNode = idxNode.next c++ } return idxNode } func(list *MyDoubleLinklist) print() { head := list.head for head != nil { fmt.Printf("%d \t", head.value) head = head.next } } func(list *MyDoubleLinklist) printReverse() { tail := list.tail for tail != nil { fmt.Printf("%d \t", tail.value) tail = tail.prev } } func main() { list := NewMyDoubleLinklist(5) list.append(12) list.append(10) list.prepend(15) list.prepend(1) list.print() list.printReverse() // _, err := list.remove(2) // if err != nil { // fmt.Println("insert error: ", err) // } // fmt.Println("\nafter remove node at index 2") //list.printReverse() // _, err = list.insert(1, 100) // if err != nil { // fmt.Println("insert error: ", err) // } // fmt.Printf("\nafter insert node value %d at index %d \n", 100, 1) // list.print() }
Editor Settings
Theme
Key bindings
Full width
Lines