Метод ring.Ring.Move

Метод ring.Ring.Move перемещает текущий указатель кольцевого списка на n позиций. В качестве единственного параметра он принимает целое число n — количество шагов для перемещения. Метод возвращает элемент *Ring, на который указывает указатель после перемещения. Если n положительное, перемещение происходит вперед (по направлению метода Next), если отрицательное — назад (по направлению метода Prev).

Синтаксис

gor.Move(n int) *Ring

Пример

Давайте создадим кольцевой список из пяти элементов и переместим указатель на две позиции вперед:

gopackage main

import (
  "container/ring"
  "fmt"
)

func main() {
  r := ring.New(5)
  for i := 0; i < r.Len(); i++ {
    r.Value = i + 1
    r = r.Next()
  }

  // Начинаем с первого элемента
  r = r.Move(0)
  fmt.Println("Current:", r.Value)

  // Перемещаемся на 2 элемента вперед
  r = r.Move(2)
  fmt.Println("After move +2:", r.Value)
}

Результат выполнения кода:

go"Current: 1"
"After move +2: 3"

Пример

Теперь переместим указатель на три позиции назад от текущего элемента:

gopackage main

import (
  "container/ring"
  "fmt"
)

func main() {
  r := ring.New(5)
  for i := 0; i < r.Len(); i++ {
    r.Value = i + 1
    r = r.Next()
  }

  // Начинаем с элемента со значением 3
  r = r.Move(2)
  fmt.Println("Start at:", r.Value)

  // Перемещаемся на 3 элемента назад
  r = r.Move(-3)
  fmt.Println("After move -3:", r.Value)
}

Результат выполнения кода:

go"Start at: 3"
"After move -3: 5"

Пример

Метод Move корректно обрабатывает перемещение на количество шагов, превышающее длину списка. В этом случае перемещение происходит по модулю длины кольца:

gopackage main

import (
  "container/ring"
  "fmt"
)

func main() {
  r := ring.New(3)
  for i := 0; i < r.Len(); i++ {
    r.Value = i + 1
    r = r.Next()
  }

  // Начинаем с первого элемента
  r = r.Move(0)
  fmt.Println("Start:", r.Value)

  // Перемещаемся на 5 шагов вперед (эквивалентно +2)
  r = r.Move(5)
  fmt.Println("Move +5 (mod 3):", r.Value)
}

Результат выполнения кода:

go"Start: 1"
"Move +5 (mod 3): 3"

Смотрите также

  • метод ring.Ring.Next,
    который возвращает следующий элемент кольцевого списка
  • метод ring.Ring.Prev,
    который возвращает предыдущий элемент кольцевого списка
  • метод ring.Ring.Link,
    который соединяет два кольцевых списка
  • метод ring.Ring.Unlink,
    который удаляет элементы из кольцевого списка