2010-09-17 129 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; 
    } 
}