2017-11-25 224 views
0

这是我迄今为止,但它不是在测试文件上工作。基本上跳到别的if(cnode == preposition)如何删除链接列表中的节点?

void LinkedList::Delete(Node *PrePosition) { 

    Node *cnode = head; 
    Node *pnode = NULL; 
    while (cnode != NULL) { 
     if (cnode->value != NULL) { 
      if (pnode == NULL) { 
       //if there is not previous node 
       head = cnode->next; 
      } 
      else if(cnode == PrePosition){ 
       //if there is previous node 
       cout << endl << "Deleting: " << cnode << endl; 
       pnode->next = cnode->next; 
      } 
     } 
     else { 
      //dont delete 
      pnode = cnode; 
     } 
     cnode = cnode->next; 

    } 

} 

回答

3

1:从以前的节点带指针,它指向要删除

2一前一后的下一个:从以前的节点删除指针当前节点

3:删除从下一个节点的指针到当前节点(如果它是一个双向链表)

+1

顺便说一句,有关于geeksforgeeks.com的额外信息 – 2017-11-25 23:13:23

+0

最好是将更多信息(包括链接)编辑到您的答案中,而不是将其添加为评论 – PiedPiper

+0

@PiedPiper,对不起,我对此很新颖,我请记住:) – 2017-11-26 21:10:02

1

三起案件在单链表中删除的:

  1. codementor删除第一个节点

    void delete_first() 
    { 
        node *temp=new node; 
        temp=head; 
        head=head->next; 
        delete temp; 
    } 
    
  2. 删除最后一个节点

    void delete_last() 
    { 
        node *current = new node; 
        node *previous = new node; 
        current=head; 
        while(current->next != NULL) 
        { 
         previous = current; 
         current = current->next; 
        } 
        tail = previous; // if you have a Node* tail member in your LinkedList 
        previous->next = NULL; 
        delete current; 
    } 
    
  3. 删除在特定的位置(你的情况)

    void LinkedList::delete_position(int pos) 
    { 
        node *current=new node; 
        node *previous=new node; 
        current=head; 
        for(int i=1; i < pos; i++) //or i = 0; i < pos-1 
        { 
         previous=current; 
         current=current->next; 
        } 
        previous->next=current->next; 
    } 
    

    ^^ ^^

但是,如果你的函数签名打算delete_node(Node* nodeToDelete) [介词是不是一个好名字在这种情况下]你想删除传递给函数的节点在不知道我们可以修改delete_position(在列表中的位置),像这样:

void LinkedList::delete_node(Node* nodeToDelete) 
{ 
    if (head == nodeToDelete){ 
     head = nodeToDelete->next; 
     return 
    }//else: 
    node *current=new node; 
    node *previous=new node; 
    current=head; 
    while(current != nodeToDelete) 
    { 
     previous = current; 
     current = current->next 
    } 
    previous->next = current->next; 
} 

另外在你的原代码,如果它跳过你所提到的线,pnode总是空当cnode中有一个非空值。

+0

如果你已经有一个指针到以前的位置,为什么重复列表,找到了吗? – user4581301

+0

@ElfenDew现在我感觉不好,因为我的票比你多。 – 2017-11-26 04:28:12