如何从链表中删除节点?

时间:2010-09-17 02:59:09

标签: c++ linked-list abstract-class

如何从单个链表中删除节点(两个节点之间)而不将任何参数传递给类函数?

例如,我有一个包含一个头节点的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 个答案:

答案 0 :(得分:2)

我觉得这个问题太混乱了。

从列表中删除节点总是基于某些标准,例如元素的内容,元素的位置等(除非你删除列表中的所有元素)

答案 1 :(得分: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);
  }
}

答案 2 :(得分:2)

您的编辑先前信息,该位表示“counter&lt; = 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

答案 3 :(得分:1)

将前一个变量初始化为null。如果删除节点,则更改元素下一个节点旁边的前一个节点,除非前一个为空(您位于列表的开头),当您保留前一个空值并将root更改为已删除元素的下一个节点时。如果不删除元素,请在元素之前进行更改。

这里的前一个元素总是指向上一个元素,如果你在列表的开头,则为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;
    }
}