найти средний элемент связанного списка
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: найти средний элемент связанного списка
Вообще, что характерно, у наивного подхода - пройти по списку полтора раза - ровно та же сложность, что и у подхода с двумя указателями.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 24375
- Joined: 18 Nov 2003 16:42
Re: найти средний элемент связанного списка
вот тут сердечно соглашусьavitya wrote:для списка не нужна последовательная память (одно из редких преимуществ списка)
Don't code today what you can't debug tomorrow.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: найти средний элемент связанного списка
А мне оттуда (http://www.geeksforgeeks.org/write-a-c- ... nked-list/) не приведенный тобой второй метод понравился (которым я тоже на интервью помнится писал, т.к. это стандартное решение), а третий метод:АццкоМото wrote:Короче...Code: Select all
struct node* findMiddle(struct node* head) { struct node *slow_ptr = head; struct node *fast_ptr = head; if(head!=NULL) { while((fast_ptr->next)!=NULL && (fast_ptr->next->next)!=NULL) { fast_ptr = fast_ptr->next->next; slow_ptr = slow_ptr->next; } return slow_ptr; } else { return NULL; } }
Code: Select all
void printMiddle(struct node *head)
{
int count = 0;
struct node *mid = head;
while (head != NULL)
{
/* update mid, when 'count' is odd number */
if (count & 1)
mid = mid->next;
++count;
head = head->next;
}
/* if empty list is provided */
if (mid != NULL)
printf("\tThe middle element is %d\n\n", mid->data);
}
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: найти средний элемент связанного списка
Это по нашему, просили на яве, получили на с
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: найти средний элемент связанного списка
Если список двусвязный - то идти с обоих концов пока не встретятся.
Если односвязный, то не вижу ничего плохого что бы пройти вначале весь список, узнать размер, и потом пройти еще раз до половины.
Если односвязный, то не вижу ничего плохого что бы пройти вначале весь список, узнать размер, и потом пройти еще раз до половины.
In vino Veritas!
-
- Уже с Приветом
- Posts: 24375
- Joined: 18 Nov 2003 16:42
Re: найти средний элемент связанного списка
отличная мысль.crypto5 wrote:Если список двусвязный - то идти с обоих концов пока не встретятся.
я ещё почесал репу и должен признать что в случае с вложенным циклом не полтора прохода получается а один проход. в этом смысле проход с двух концов даёт тот же результат. но мне нравится больше
Don't code today what you can't debug tomorrow.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: найти средний элемент связанного списка
В вашем подходе(думаю вложенные циклы там все таки лишние, а имеется в виду то что реализовал Ацкомотто), вы факточески проходите полтора раза по списку, т.к. в первой части списка по каждому элементу проходит и быстрый указатель и медленный.rzen wrote:отличная мысль.crypto5 wrote:Если список двусвязный - то идти с обоих концов пока не встретятся.
я ещё почесал репу и должен признать что в случае с вложенным циклом не полтора прохода получается а один проход. в этом смысле проход с двух концов даёт тот же результат. но мне нравится больше
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: найти средний элемент связанного списка
Так имплементация почти одинаковая будет.valchkou wrote:Это по нашему, просили на яве, получили на с
-
- Уже с Приветом
- Posts: 762
- Joined: 20 Jan 2005 00:27
- Location: La Jolla, California
Re: найти средний элемент связанного списка
Иначе петлю не найти без использования доплолнительной памяти. А вот в данном случае можно сначала пройти по списку чтоб узнать его длину O(N) если он не замкнутый на себя конечно а потом еще раз пройти O(n/2) чтоб взять средний. Что в лоб что по лбу.АццкоМото wrote:Да просто же. Точно также, как ищутся петли в связанном списке: начинается траверсал с начала двумя указателями, один передвигается на один элемент вперед, второй - на два. как второй уперся в конец, первый - в середине
Затраты будут те же O(n*3/2), что и если будем толкать два бегунка быстрый и медленный одновременно.
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: найти средний элемент связанного списка
Ага, вроде и тот же хрен в другой руке, а гораздо элегантнееИнтеррапт wrote: А мне оттуда (http://www.geeksforgeeks.org/write-a-c- ... nked-list/) не приведенный тобой второй метод понравился (которым я тоже на интервью помнится писал, т.к. это стандартное решение), а третий метод:
Code: Select all
void printMiddle(struct node *head) { int count = 0; struct node *mid = head; while (head != NULL) { /* update mid, when 'count' is odd number */ if (count & 1) mid = mid->next; ++count; head = head->next; } /* if empty list is provided */ if (mid != NULL) printf("\tThe middle element is %d\n\n", mid->data); }
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: найти средний элемент связанного списка
Да, Кэп, так и естьTarasik wrote:Иначе петлю не найти без использования доплолнительной памяти. А вот в данном случае можно сначала пройти по списку чтоб узнать его длину O(N) если он не замкнутый на себя конечно а потом еще раз пройти O(n/2) чтоб взять средний. Что в лоб что по лбу.АццкоМото wrote:Да просто же. Точно также, как ищутся петли в связанном списке: начинается траверсал с начала двумя указателями, один передвигается на один элемент вперед, второй - на два. как второй уперся в конец, первый - в середине
Затраты будут те же O(n*3/2), что и если будем толкать два бегунка быстрый и медленный одновременно.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: найти средний элемент связанного списка
Просили приятеля, а написали на форуме. Это не смущает?valchkou wrote:Это по нашему, просили на яве, получили на с
К тому же на яве тоже написали
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 5538
- Joined: 20 Mar 2001 10:01
- Location: SFBA
Re: найти средний элемент связанного списка
Немного напоминает мне одного кандидата, которого попросили найти минимальное и максимальное значение среди элементов списка целых чисел. Он натурально все скопировал в массив, отсортировал его пузырьком, и на закуску ошибся, когда доставал последний элемент.
Увидев друга, Портос вскрикнул от радости...
-
- Уже с Приветом
- Posts: 63377
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: найти средний элемент связанного списка
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: найти средний элемент связанного списка
Привык уже, и скоро си выучу, читая приветАццкоМото wrote:Просили приятеля, а написали на форуме. Это не смущает?valchkou wrote:Это по нашему, просили на яве, получили на с
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: найти средний элемент связанного списка
Ну так там же было на джаве; разница по сути в node.next вместо node->next а, ну и звездочки поубиватьvalchkou wrote:Привык уже, и скоро си выучу, читая приветАццкоМото wrote:Просили приятеля, а написали на форуме. Это не смущает?valchkou wrote:Это по нашему, просили на яве, получили на с
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: найти средний элемент связанного списка
Ну, тогда как математик решает задачи.8K wrote:Немного напоминает мне одного кандидата, которого попросили найти минимальное и максимальное значение среди элементов списка целых чисел. Он натурально все скопировал в массив, отсортировал его пузырьком, и на закуску ошибся, когда доставал последний элемент.
Задача 1.
Дано - Плитка, кран, кастрюля
Цель - Вскипятить воды.
Решение - Открыть кран, набрать воды в кастрюлю, закрыть кран, поставить кастрюлю на плиту, включить ее
Задача 2.
Дано - Плитка, кран, кастрюля с водой на плите
Цель - Вскипятить воды.
Решение - вылить воду из кастрюли, свели к условиям задачи #1
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 150
- Joined: 18 May 2012 20:00
-
- Новичок
- Posts: 32
- Joined: 17 Dec 2009 12:39
Re: найти средний элемент связанного списка
Извиняюсь, но хотелось бы уточнить цель вопроса. Вам код или более эффективный алгоритм?rzen wrote:задали приятелю вопрос на интервью, ответ (от интервьюера) был такой, мол запустить цикл в цикле, внешний цикл по каждому элементу, внутренний через один, когда внутренний закончится, внешний как раз укажет на средний элемент.
а как бы вы такую задачу решили практически?
да, чуть не забыл, язык жаба.
-
- Уже с Приветом
- Posts: 4205
- Joined: 10 Jan 2004 01:22
- Location: n-sk -> MD -> VA
Re: найти средний элемент связанного списка
задачка на здравый смысл. требуется написать код за 5 минут. я в пятницу попробовал ее на паре соискателей
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: найти средний элемент связанного списка
а никто не пробовал попросить написать любой код по желанию ?fruit6 wrote:задачка на здравый смысл. требуется написать код за 5 минут. я в пятницу попробовал ее на паре соискателей
-
- Уже с Приветом
- Posts: 24375
- Joined: 18 Nov 2003 16:42
Re: найти средний элемент связанного списка
а смысл? вы ж не фантазёров на работу ищите.valchkou wrote:а никто не пробовал попросить написать любой код по желанию ?fruit6 wrote:задачка на здравый смысл. требуется написать код за 5 минут. я в пятницу попробовал ее на паре соискателей
Don't code today what you can't debug tomorrow.
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: найти средний элемент связанного списка
так разве та контора не фантазеров искала.rzen wrote:а смысл? вы ж не фантазёров на работу ищите.valchkou wrote:а никто не пробовал попросить написать любой код по желанию ?fruit6 wrote:задачка на здравый смысл. требуется написать код за 5 минут. я в пятницу попробовал ее на паре соискателей
Ну есть уже на яве и size() и get(i) на связаном списке, в чем смысл спрашивать как бы вы изобрели свой велосипед ?
Правильно, только в том, чтобы выяснить вашу велосипедную изобретательность, а не умение использовать уже говый.
-
- Уже с Приветом
- Posts: 24375
- Joined: 18 Nov 2003 16:42
Re: найти средний элемент связанного списка
то что вопрос был дурацкий это одно, а то что кандидат должен сам себе придумывать вопросы это другое. разновидностей идиотизма как мы видим немалоvalchkou wrote:так разве та контора не фантазеров искала.rzen wrote:а смысл? вы ж не фантазёров на работу ищите.valchkou wrote:а никто не пробовал попросить написать любой код по желанию ?fruit6 wrote:задачка на здравый смысл. требуется написать код за 5 минут. я в пятницу попробовал ее на паре соискателей
Ну есть уже на яве и size() и get(i) на связаном списке, в чем смысл спрашивать как бы вы изобрели свой велосипед ?
Правильно, только в том, чтобы выяснить вашу велосипедную изобретательность, а не умение использовать уже говый.
Don't code today what you can't debug tomorrow.
-
- Уже с Приветом
- Posts: 8470
- Joined: 02 Aug 2003 01:32
- Location: SPb->SFBA
Re: найти средний элемент связанного списка
Нормальная задачка. На понимание связанных списков.
По моим наблюдениям, человек, решающий подобную задачу через size() и get(i), потом пишет такой код
По моим наблюдениям, человек, решающий подобную задачу через size() и get(i), потом пишет такой код
for (i=0; i< list.size(); i++) {
if (list.get(i)==someObject) {....}
}