2017-01-03 2 views
0

При выполнении удаления операции узла в связанный список, я часто сталкиваюсь с кодом:Как удаляется узел в связанном списке?

**head=head->next** 

Где «голова» является связным списком и «рядом» является составной частью связанного списка, который связывает все узел вместе.

Как этот код фактически меняет членов (удаляет член) связанного списка.

+0

Я не уверен, на каком языке вы бы использовали две звездочки. Вы имеете в виду * head = * head-> next? – synchronizer

ответ

2

@Remy реснички правильно, но что-то о своих звездочками предполагает, что вы имеете в виду что-то вроде этого в C:

int remove_first(node_t** head) 
{ 
    if (head == NULL || *head == NULL) return -1; 

    node_t* save = *head; 
    *head = save->next; 
    free(save); 

    return 0; 
} 

Мы передаем двойной указатель на функцию по причине. Если мы прошли один указатель, мы будем делать это:

int remove_first(node_t* head) 
{ 
    if (head == NULL) return -1; 

    node_t* save = head; 
    head = save->next; 
    free(save); // bad idea 

    return 0; 
} 

// before function call: 
head->node->next->NULL 
// during function call 
head->node->next->NULL 
head---^ 
// before return: 
    head->NULL next->NULL // (anyone can correct this line, but we can still free that node I believe) 
head-------------^ 
// after return: 
head->NULL next->NULL 

Единый указатель просто создает копию указателя головы, а не изменяющего оригинал, который никогда не двигался.

С двойным указателем:

// before function call: 
    head->node->next 
    // during function call 
    head->node->next 
head--^ 
    // before return: 
    head->next 
head--^ 
    // after return: 
    head->next 

С головой двойного указателя является адрес оригинальной головы, мы де-ссылка двойного указателя на доступ к исходной головке ponter, а не копия. Таким образом, мы можем направить исходный указатель.

+1

Функция удаления может вернуть обновленный (при необходимости) указатель на голову. Вызов будет head = delete (head, value), который удалит первый узел с этим значением, или как еще один пример: head = deletefirst (head). Использование двойного указателя внутри будет все еще упрощать код, но один указатель может быть передан как параметр. – rcgldr

+0

@ rcgldr Спасибо за альтернативный ответ. – synchronizer

1

Этот код удалит первый элемент связанного списка.

Если «head» является первым элементом списка, «head-> next» является вторым элементом. Выполнение 'head = head-> next' переводит второй элемент в первую позицию. Таким образом, в следующий раз, когда вы получите доступ к связанному списку с помощью «head», вы получите второй элемент, а старый первый элемент больше не входит в список.

Смежные вопросы