如何删除链接列表中的节点?
这是我迄今为止,但它不是在测试文件上工作。基本上跳到别的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;
}
}
1:从以前的节点带指针,它指向要删除
2一前一后的下一个:从以前的节点删除指针当前节点
3:删除从下一个节点的指针到当前节点(如果它是一个双向链表)
三起案件在单链表中删除的:
-
从codementor删除第一个节点
void delete_first() { node *temp=new node; temp=head; head=head->next; delete temp; }
-
删除最后一个节点
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; }
-
删除在特定的位置(你的情况)
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中有一个非空值。
如果你已经有一个指针到以前的位置,为什么重复列表,找到了吗? – user4581301
@ElfenDew现在我感觉不好,因为我的票比你多。 – 2017-11-26 04:28:12
顺便说一句,有关于geeksforgeeks.com的额外信息 – 2017-11-25 23:13:23
最好是将更多信息(包括链接)编辑到您的答案中,而不是将其添加为评论 – PiedPiper
@PiedPiper,对不起,我对此很新颖,我请记住:) – 2017-11-26 21:10:02