Golang: односвязный список
В Go нет встроенного типа для односвязного списка, как в некоторых других языках. Однако можно реализовать его самостоятельно с использованием структур и указателей.
Вот базовая реализация односвязного списка в Go:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
package main import "fmt" // Node представляет элемент односвязного списка type Node struct { value int next *Node } // LinkedList представляет сам список, храня ссылку на первый элемент (голову) type LinkedList struct { head *Node } // Add добавляет новый элемент в конец списка func (list *LinkedList) Add(value int) { newNode := &Node{value: value} // Если список пуст, новый элемент становится головой if list.head == nil { list.head = newNode return } // Иначе находим последний элемент и добавляем к нему новый current := list.head for current.next != nil { current = current.next } current.next = newNode } // Print выводит элементы списка func (list *LinkedList) Print() { current := list.head for current != nil { fmt.Printf("%d -> ", current.value) current = current.next } fmt.Println("nil") } // Remove удаляет первый элемент с заданным значением func (list *LinkedList) Remove(value int) { // Если список пуст, ничего не делаем if list.head == nil { return } // Если голова содержит искомое значение, перемещаем голову на следующий элемент if list.head.value == value { list.head = list.head.next return } // Ищем элемент с нужным значением и удаляем его current := list.head for current.next != nil { if current.next.value == value { current.next = current.next.next return } current = current.next } } func main() { list := &LinkedList{} // Добавляем элементы list.Add(1) list.Add(2) list.Add(3) list.Add(4) // Выводим список list.Print() // 1 -> 2 -> 3 -> 4 -> nil // Удаляем элемент list.Remove(3) list.Print() // 1 -> 2 -> 4 -> nil // Удаляем элемент, которого нет в списке (ничего не меняется) list.Remove(5) list.Print() // 1 -> 2 -> 4 -> nil } |
Объяснение кода:
- Структура
Node
представляет узел списка, который содержит значениеvalue
и указатель на следующий узелnext
. - Структура
LinkedList
представляет сам список и содержит указатель на первый элементhead
. - Метод
Add
добавляет новый узел в конец списка. - Метод
Print
выводит все элементы списка. - Метод
Remove
удаляет первый найденный узел с заданным значением.
Этот код демонстрирует основные операции для односвязного списка: добавление, вывод и удаление элементов.
Recommended Posts
Golang Sarama: настройка Partitioner
20.03.2024