Я пишу код для поворота односвязного списка против часовой стрелки на число K узлов. Я написал следующий код. Например, для связанного списка ввода: 1,2,3,4,5,6,7,8
функция поворота Node *rotate(Node *head, int k){}
возвращает указатель заголовка на связанный список 5,6,7,8,1,2,3,4
. Я написал следующий код. В этом коде, если я вызываю print(head)
внутри функции поворота, то это дает правильный вывод, но как только он возвращает указатель головы на main, он либо выдает SIGSEV, либо выдает 1,2,3,4
.
#include <iostream>
using namespace std;
class List {
public:
int data;
List *next;
explicit List(int element) : data(element), next(nullptr){}
};
List *insert() {
int n, i, value;
List *temp = nullptr, *head = nullptr;
cin >> n;
for(i = 0; i < n; ++i) {
cin >> value;
if(i == 0) {
head = new List(value);
temp = head;
continue;
} else {
temp ->next = new List(value);
temp = temp->next;
}
}
return head;
}
void print(List *start) {
while(start != nullptr) {
cout << start ->data << " ";
start = start->next;
}
}
List* rotate(List* head, int k) {
List *traverse = head, *temp = head;
List *kth, *end;
int i = 0;
while(i < k - 1) {
traverse = traverse ->next;
++i;
}
kth = traverse;
while(traverse->next != nullptr) {
traverse = traverse->next;
}
end = traverse;
head = kth->next;
kth->next = nullptr;
end->next = temp;
print(head);
return head;
}
int main() {
int k;
List *head = insert();
cin >> k;
print(head);
cout << endl;
rotate(head, k);
print(head);
return 0;
}
PS: мне разрешено изменять только функцию поворота.