2010-09-17 131 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个节点? – 2010-09-17 03:03:12

+0

对不起,只要我发布这个,我去编辑它,因为我意识到我的问题是多么模糊/混淆。希望现在更清楚 – 2010-09-17 03:07:55

+0

这是功课吗?在删除节点之前考虑数据结构的外观(或草稿纸上的草稿),以及节点指针如何更改为从链中“断开”节点。还要考虑在你解除链接目标节点的时候'temp'指向的位置,以及解除链接后它应该指向的位置,以及'temp'是否需要提前('temp = temp-> next')。 – 2010-09-17 03:17:56

回答

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

谢谢,我编辑了这个问题。希望现在更清楚。我想根据元素 – 2010-09-17 03:06:44

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 2010-09-17 03:54:49

+0

@ sje397:同意......我曾假设OP想要除“我已经迭代了整个列表”之外的其他条件。 thx为up – paquetp 2010-09-19 12:24:41

1

将以前的变量初始化为null。如果您删除了一个节点,那么当您离开先前的空值并将root更改为删除的元素的下一个时,请更改元素下一个元素的前一个元素,除非前一个元素为null(您位于列表的起始位置)。如果您不删除该元素,请先更改该元素。

这里以前将始终指向前一个元素,或者如果您位于列表的开头,则为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; 
    } 
}