2010-09-17 3 views
1

Как удалить узел (между двумя узлами) из одного связанного списка без передачи каких-либо параметров функции класса?Как удалить узел из связанного списка?

Например, у меня есть список из 6 узлов с одним головным узлом, и я хочу удалить два из них (без предварительного знания их адреса или позиции) из функции класса, как бы я это сделал?

void WordList::deleteNode(){ 
Node *temp; 
temp=head; 
if(temp->count<=10) 
{ 
//delete this node... not sure how though 
} 
else 
temp=temp->next; 
} 

где WordList мой класс, Node моя структура, которая держит слово, граф и указатель. Я хочу удалить любой узел, у которого есть счетчик 10 или меньше.

+1

Какие 2 узла ?. –

+0

извините, как только я разместил это, я пошел редактировать его, потому что понял, насколько неопределенным/запутанным был мой вопрос. Надеюсь, теперь станет яснее –

+0

Это домашнее задание? Подумайте о том, как выглядит структура данных перед удалением узла (или черновик на бумаге с царапинами), и как нужно указывать указатели узлов для «отсоединения» узла от цепочки. Также подумайте о том, где 'temp' указывает на то, что вы отсоединяете целевой узел и где он должен указывать после отключения, и нужно ли продолжать« temp »(« temp = temp-> next »). –

ответ

2

Ваша правка имеет априорной информации, бит, который заявляет, что "счетчик < = 10" :-)

Псевдо-код для удаления элементов встречи, что критерии в односвязный список:

def delLessThanTen: 
    # Delete heads meeting criteria, stop when list empty. 

    while head != NULL and head->count <= 10: 
     temp = head->next 
     free head 
     head = temp 
    if head == NULL: 
     return 

    # Head exists, with count > 10, process starting there (we check 
    # NEXT element for criteria then delete if met). 

    ptr = head 
    while ptr->next != NULL: 
     # If next in list meets criteria, delete it, otherwise advance. 

     if ptr->next->count <= 10: 
      temp = ptr->next->next 
      free ptr->next 
      ptr->next = temp 
     else: 
      ptr = ptr->next 

    return 
2

Я нахожу этот вопрос слишком запутанным.

Удаление узла из списка всегда основано на некоторых критериях, например. содержание элемента, положение элемента и т.д. (если не вы удалите все элементы в списке)

+0

Спасибо, я редактировал вопрос. Надеюсь, теперь это станет более ясным. Я хочу удалить его на основе содержимого элемента –

2

что-то вроде этого:

void WordList::deleteNode(){ 
Node *prev=NULL; 
temp=head; 
bool done=false; 
while (!done) 
{ 
    if (temp->count<=10) 
    { 
    if (prev == NULL) 
    { 
     head = temp->next; 
    } else 
    { 
     prev->next = temp->next; 

    } 
    // delete data in temp, and the node if necessary 
    temp = temp->next; 
    done = (temp==NULL) || // some other condition, like deleted 2 
    } else 
    { 
    prev=temp; 
    temp = temp->next; 
    done = (temp==NULL); 
    } 
} 
+0

+1. Но я бы просто использовал 'while (temp)'. – sje397

+0

@ sje397: согласился ... Я предположил, что OP хотел других условий, кроме «Я перечислил весь список». thx для повышения – paquetp

1

Имейте предыдущую переменную, инициализированную нулем. Если вы удалите узел, замените предыдущий на следующий следующий элемент, если только предыдущий не является нулевым (вы находитесь в начале списка), когда вы покидаете предыдущий null и изменяете корень на следующий удаленный элемент. Если вы не удалите элемент, измените его ранее.

Здесь предыдущий всегда будет указывать на предыдущий элемент или быть нулевым, если вы находитесь в начале списка.

void WordList::deleteNode() { 
    Node *temp = head; 
    Node *previous = null; 
    while (temp != null) { 
     if(temp->count <= 10) { 
      // delete node 
      if (previous == null) { 
       // there is no previous node, so point head of list past the current node 
       head = temp->next; 
      } else { 
       // there is a previous node, so just point it past the current node 
       previous->next = temp->next; 
      } 
     } else { 
      // not deleting, so set previous to temp 
      previous = temp; 
     } 
     temp = temp->next; 
    } 
} 
Смежные вопросы