#c
#c
Вопрос:
Я сделал код для вставки элементов в связанный список, который работает должным образом.Затем я написал код для преобразования связанного списка в группы заданного размера.Моя проблема в том, что выполнение моего кода занимает слишком много времени, потому что я хочу оптимизировать этот код.
Например:
ВВОД
8 //number of elements
1 2 2 4 5 6 7 8 //elements
4 //position to reverse the list elements
ВЫВОД
4 2 2 1 8 7 6 5
struct node *reverse (struct node *head, int k)
{
int count=0,i=0,j=0,a[1000],start=0,end;
struct node *temp=head;
struct node *t=head;
struct node *tt=head;
while(temp!=NULL)
{
temp=temp->next;
count ;
}
while(count!=0)
{
while((k--)amp;amp;(t!=NULL))
{
a[i ]=t->data;
t=t->next;
}
end=i-1;
while(start<end)
{
int temp=a[start];
a[start]=a[end];
a[end]=temp;
start ;
end--;
}
while(tt->next!=t)
{
tt->data=a[j];
j ;
tt=tt->next;
}
tt->data=a[j];
count=count-k;
i=0;
j=0;
}
return head;
}
Комментарии:
1. Есть ли какая-либо причина, по которой вы реализуете связанный список для того, что вы можете хранить в простом массиве? Просто сохраните числа в массиве и поменяйте местами фрагменты массива.
a[1000]
вы даже сохраняете данные в массиве, переворачиваете их, а затем возвращаетесь в связанный список. И почемуa[1000]
? Почему бы и нетa[1002]
? Пожалуйста, напишите MCVE, какnode
объявляется? Как вызывается функция? Вы не считываете никаких входных данных и ничего не выводите из кода? Пожалуйста, опубликуйте полный воспроизводимый пример, который можно скомпилировать. .2. TLE означает, что, к сожалению, решение недостаточно хорошее. Довольно часто с проблемами «онлайн-оценки» очевидное решение не будет достаточно быстрым, и реальная проблема заключается в том, чтобы найти хороший алгоритм и эффективно его закодировать.
Ответ №1:
Необходимый код буквально равен 6!! строки длиной
Вот вам мой пример
#include <stdio.h>
void reverse(int *first, int *last)
{
int tmp;
while(first < last)
{
tmp = *first;
*first = *last;
*last-- = tmp;
}
}
void reverseFromPos(int *arr, size_t len, size_t pos)
{
reverse(amp;arr[0], amp;arr[pos - 1]);
reverse(amp;arr[pos], amp;arr[len -1]);
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8, 9};
size_t len;
reverseFromPos(arr, len =sizeof(arr) / sizeof(arr[0]), 4);
for(size_t index = 0; index < len; index )
printf("%d ", arr[index]);
printf("n");
return 0;
}