Как удалить узел из связанного списка? - PullRequest
1 голос
/ 17 сентября 2010

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

Например, у меня есть список из 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 или меньше.

Ответы [ 4 ]

2 голосов
/ 17 сентября 2010

как то так:

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);
  }
}
2 голосов
/ 17 сентября 2010

Ваша правка содержит априорной информации, бит, который сообщает "counter <= 10": -) </p>

Псевдокод для удаления элементов, отвечающих этим критериям в односвязном списке:

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 голосов
/ 17 сентября 2010

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

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

1 голос
/ 17 сентября 2010

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

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

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;
    }
}
...