Te4nick

GoLinkedList

May 18th, 2023
1,220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 6.29 KB | None | 0 0
  1. package LinkedList
  2.  
  3. import (
  4.     "errors"
  5.     "fmt"
  6.     "strings"
  7. )
  8.  
  9. type Node struct {
  10.     value interface{}
  11.     next  *Node
  12. }
  13.  
  14. type LinkedList struct {
  15.     first *Node
  16.     last  *Node
  17.     size  int
  18. }
  19.  
  20. func New(values ...interface{}) *LinkedList {
  21.     ll := &LinkedList{}
  22.     if len(values) > 0 {
  23.         ll.Add(values...)
  24.     }
  25.     return ll
  26. }
  27.  
  28. func (ll *LinkedList) Add(values ...interface{}) {
  29.     for _, value := range values {
  30.         node := &Node{value: value, next: nil}
  31.         if ll.size == 0 {
  32.             ll.first = node
  33.             ll.last = node
  34.         } else {
  35.             ll.last.next = node
  36.             ll.last = node
  37.         }
  38.         ll.size++
  39.     }
  40. }
  41.  
  42. func (ll *LinkedList) Append(values ...interface{}) {
  43.     ll.Add(values...)
  44. }
  45.  
  46. func (ll *LinkedList) Prepend(values ...interface{}) {
  47.     for index := len(values) - 1; index >= 0; index-- {
  48.         node := &Node{value: values[index], next: ll.first}
  49.         ll.first = node
  50.         if ll.size == 0 {
  51.             ll.last = node
  52.         }
  53.         ll.size++
  54.     }
  55. }
  56.  
  57. func (ll *LinkedList) Set(index int, value interface{}) error {
  58.     if !ll.withinRange(index) {
  59.         return errors.New(fmt.Sprintf("LinkedList: index %d is out of range (size = %d)", index, ll.size))
  60.     }
  61.  
  62.     foundValue := ll.first
  63.     for i := 0; i != index; i++ {
  64.         foundValue = foundValue.next
  65.     }
  66.     foundValue.value = value
  67.     return nil
  68. }
  69.  
  70. func (ll *LinkedList) Get(index int) (interface{}, error) {
  71.     if !ll.withinRange(index) {
  72.         return nil, errors.New(fmt.Sprintf("LinkedList: index %d is out of range (size = %d)", index, ll.size))
  73.     }
  74.  
  75.     node := ll.first
  76.     for i := 0; i != index; i, node = i+1, node.next {
  77.     }
  78.     return node.value, nil
  79. }
  80.  
  81. func (ll *LinkedList) Remove(index int) error {
  82.     if !ll.withinRange(index) {
  83.         return errors.New(fmt.Sprintf("LinkedList: index %d is out of range (size = %d)", index, ll.size))
  84.     } else if ll.size == 1 {
  85.         ll.Clear()
  86.     }
  87.  
  88.     var beforeNode *Node
  89.     node := ll.first
  90.     for e := 0; e != index; e, node, beforeNode = e+1, node.next, node {
  91.     }
  92.  
  93.     if node == ll.first {
  94.         ll.first = node.next
  95.     }
  96.     if node == ll.last {
  97.         ll.last = beforeNode
  98.     }
  99.     if beforeNode != nil {
  100.         beforeNode.next = node.next
  101.     }
  102.  
  103.     node = nil
  104.     ll.size--
  105.     return nil
  106. }
  107.  
  108. func (ll *LinkedList) Insert(index int, values ...interface{}) error {
  109.  
  110.     if !ll.withinRange(index) {
  111.         return errors.New(fmt.Sprintf("LinkedList: index %d is out of range (size = %d)", index, ll.size))
  112.     }
  113.     if index == 0 {
  114.         ll.Prepend(values...)
  115.         return nil
  116.     }
  117.  
  118.     ll.size += len(values)
  119.     var beforeNode *Node
  120.     foundNode := ll.first
  121.     for e := 0; e != index; e, foundNode, beforeNode = e+1, foundNode.next, foundNode {
  122.     }
  123.  
  124.     oldNextElement := beforeNode.next
  125.     for _, value := range values {
  126.         newElement := &Node{value: value}
  127.         beforeNode.next = newElement
  128.         beforeNode = newElement
  129.     }
  130.     beforeNode.next = oldNextElement
  131.     return nil
  132. }
  133.  
  134. func (ll *LinkedList) Contains(values ...interface{}) bool {
  135.     valueMap := make(map[interface{}]bool)
  136.  
  137.     // заполняем map значениями
  138.     for i := 0; i < len(values); i++ {
  139.         valueMap[values[i]] = true
  140.     }
  141.  
  142.     // проверяем каждый узел списка на наличие в map
  143.     for node := ll.first; node != nil; node = node.next {
  144.         if _, ok := valueMap[node.value]; ok {
  145.             delete(valueMap, node.value)
  146.         }
  147.  
  148.         if len(valueMap) == 0 {
  149.             return true
  150.         }
  151.     }
  152.     return false
  153. }
  154.  
  155. func (ll *LinkedList) IndexOf(value interface{}) (int, error) {
  156.     if ll.size == 0 {
  157.         return -1, errors.New(fmt.Sprintf("LinkedList: list is empty (size = %d)", ll.size))
  158.     }
  159.     for index, node := range ll.Values() {
  160.         if node == value {
  161.             return index, nil
  162.         }
  163.     }
  164.     return -1, errors.New(fmt.Sprintf("LinkedList: value %v is not in list", value))
  165. }
  166.  
  167. func (ll *LinkedList) Empty() bool {
  168.     return ll.size == 0
  169. }
  170.  
  171. func (ll *LinkedList) Size() int {
  172.     return ll.size
  173. }
  174.  
  175. func (ll *LinkedList) Clear() {
  176.     ll.first = nil
  177.     ll.last = nil
  178.     ll.size = 0
  179. }
  180.  
  181. func (ll *LinkedList) Values() []interface{} {
  182.     values := make([]interface{}, ll.size, ll.size)
  183.     for v, node := 0, ll.first; node != nil; v, node = v+1, node.next {
  184.         values[v] = node.value
  185.     }
  186.     return values
  187. }
  188.  
  189. func (ll *LinkedList) Swap(i, j int) error {
  190.     if !ll.withinRange(i) || !ll.withinRange(j) {
  191.         return errors.New(fmt.Sprintf("LinkedList: i=%d or j=%d is out of range (size=%d)", i, j, ll.size))
  192.     }
  193.     if i == j {
  194.         return nil
  195.     }
  196.  
  197.     var node1, node2 *Node
  198.     for e, currNode := 0, ll.first; node1 == nil || node2 == nil; e, currNode = e+1, currNode.next {
  199.         switch e {
  200.         case i:
  201.             node1 = currNode
  202.         case j:
  203.             node2 = currNode
  204.         }
  205.     }
  206.     node1.value, node2.value = node2.value, node1.value
  207.     return nil
  208. }
  209.  
  210. func (ll *LinkedList) Sort(less func(a, b interface{}) bool) {
  211.     // Если список пустой или содержит только один элемент, он уже отсортирован.
  212.     if ll.first == nil || ll.first.next == nil {
  213.         return
  214.     }
  215.  
  216.     // Создаем новый список, в который будем вставлять элементы в отсортированном порядке.
  217.     sorted := &LinkedList{first: nil, last: nil, size: ll.size}
  218.  
  219.     // Перебираем все элементы и вставляем их в отсортированный список.
  220.     for node := ll.first; node != nil; {
  221.         next := node.next
  222.  
  223.         // Находим место, куда нужно вставить текущий элемент в отсортированный список.
  224.         curr := sorted.first
  225.         var prev *Node
  226.         for curr != nil && less(curr.value, node.value) {
  227.             prev = curr
  228.             curr = curr.next
  229.         }
  230.  
  231.         // Вставляем текущий элемент в отсортированный список.
  232.         if prev == nil {
  233.             sorted.first = node
  234.         } else {
  235.             prev.next = node
  236.         }
  237.         node.next = curr
  238.  
  239.         // Переходим к следующему элементу.
  240.         node = next
  241.     }
  242.  
  243.     // Обновляем первый и последний элементы в исходном списке.
  244.     ll.first = sorted.first
  245.     ll.last = sorted.last
  246. }
  247.  
  248. func (ll *LinkedList) String() string {
  249.     s := "LinkedList: ["
  250.     strValues := make([]string, ll.size)
  251.     for index, node := 0, ll.first; node != nil; index, node = index+1, node.next {
  252.         strValues[index] = fmt.Sprintf("%v", node.value)
  253.     }
  254.     return s + strings.Join(strValues, ", ") + "]"
  255. }
  256.  
  257. func (ll *LinkedList) withinRange(index int) bool {
  258.     return 0 <= index && index < ll.size
  259. }
  260.  
Advertisement
Add Comment
Please, Sign In to add comment