Работая на основе того, что вы начинаете с [1] [2] [3] [4] [5] и хотите получить [4] [5] [1] [2] [3], вы можетеделать это с помощью указателей, а не изменять структуру данных.
Как вы указали, у нас есть циклический список, в котором указатель "tail.next" указывает на первое ведро, а каждое последующее ведение имеет указатель .next, связывающий его с его самым правым соседом, пока мы не вернемся копять заднее ведро.По сути, это набор блоков, связанных друг с другом.
Если мы создадим узел "tail" и узел "header", мы можем использовать их для упорядочения списка.Это маркеры, а не часть круга, они просто указывают на начальную или конечную точку.
Таким образом, чтобы получить [1] [2] [3] [4] [5], мы можем установить хвостовой узел наукажите на [5], затем следуйте за следующим указателем [5], который приведет нас к [1], на который мы установили наш заголовок.Таким образом, header = [1]; tail = [5]
Начиная с заголовка и работая со списком, следуя следующим указателям, каждый раз, когда мы можем получить доступ к нашим элементам в этом порядке [1] [2] [3][4] [5].Ничего удивительного!
Давайте изменим это, хотя мы хотим, чтобы [3] был сзади.Итак, давайте установим наш хвостовой узел так, чтобы он указывал на [3].Затем, следуя следующему указателю [3], мы приходим к [4].Для этого мы назначаем header.So header = [4]; tail = [3]
Теперь работаем через наш список, начиная с того, на что указывает наш заголовок [4] [5] [1] [2] [3].
Похоже, мы выполнили операцию перемещения, но мы не вмешивались в нашу структуру данных или ее связи - только в способ, которым мы работаем с ним.Все, что мы изменили, это наш заголовок и хвост.(Наши указатели).Вот в чем красота кругового списка.