从单链表中删除节点据我所知,你可以这样做:找到你要删除的节点。node.previous.next=node.nextnode.next.previous=node.previousnode.previous=nullnode.next=null如果您在非GC环境中,如果您的列表是双向链接的,则处理节点。但是如何使用链表做到这一点呢?我尝试了很多但无济于事:(我只是让它去删除一个特定的索引,或者它从列表的开头开始什么都不做。跟踪当前项目(currentItem)和上一个项目(previousItem)Reference.使用previousItem=currentItem,currentItem=currentItem.Next线性搜索要删除的项目。如果要删除的项目是列表的头部,则将列表的头部重新分配给currentItem.Next。否则,设置previousItem.Next=currentItem.Next。必要时处理currentItem(如您所说,在非GC环境中)。基本上,在双向链表的情况下,您使用previousItem来模仿currentItem.Previous的行为。编辑:这是正确的对于删除实现:publicvoidDelete(intrangeStart,intrangeEnd){NodepreviousNode=null,currentNode=Head;while(currentNode!=null){if(currentNode.Data>=rangeStart&¤tNode.Datawhiletryingtofind"currentNode",可以跟踪最后一个节点。然后你可以连接previouse.next到current.next就大功告成了。那么,您可以使用LinkedList和Remove;但手动:以下代码使用递归来跟踪前一个节点:来源:http://www.cs。bu.edu/teaching/c/linked-list/delete/nodeT*ListDelete(nodeT*currP,elementTvalue){/*看看我们是否在列表的末尾。*/if(currP==NULL)返回NULL;/**检查当前节点是否是一个*要删除的节点。*/if(currP->element==value){nodeT*tempNextP;/*在节点中保存下一个指针。*/tempNextP=currP->next;/*释放节点。*/免费(currP);/**将NEW指针返回到我们*被调用的地方。即,指针*先前的调用将用于“跳过”已删除的节点。*/返回tempNextP;}/**检查列表的其余部分,修复下一个*指针,以防下一个节点是被移除的节点。*/currP->next=ListDelete(currP->next,value);/**返回指向我们被调用的地方的指针*来自。因为我们没有删除这个节点,它*将是相同的。*/返回电流;在这里你可以找到具有所有功能的单链表的完整实现,如sertAthttp://tech.bragboy.com/2010/01/linked-lists.html注意:这有一个有效的java代码+测试类,所以你不会错过任何一个链表的组成,这是单链表的主要弱点。您需要引用前一个节点,或者从头开始扫描列表。记住你的最后一个节点。//伪代码节点prevnode=null;foreach(节点中的节点n){if(n.name.equals(name)){if(prevnode!=null){prevnode.next=n.next;}删除n;休息;}prevnode=n;具有讽刺意味的是你应该问这个问题。我也在尝试刷新我的单链表。我刚刚用C++编写了这个函数,它似乎可以工作:voidpop_back(){if(head==NULL){return;}if(head->next==NULL){删除head;头=空;返回;}节点*iter=head;while(iter->next->next!=NULL){iter=iter->next;}删除iter->next;iter->next=NULL;}对于弹出最后一个元素,但你可以稍微修改它以在中间工作,我敢肯定。在C#中,Idea几乎相同。结构node_t{int数据;结构node_t*下一个;}voiddelete_node(structnode_t*random){structnode_t*temp;/*将ptr保存到下一个节点*/temp=random->next;/*从下一个节点复制东西到这个节点*/random->data=random->next->data;随机->下一个=随机->下一个->下一个;/*删除下一个节点*/free(temp);返回;在我看来,这应该适用于大多数操作系统。staticvoidMain(string[]args){LinkedListll=newLinkedList();ll.AddLast("uno");ll.AddLast("dos");ll.AddLast("tres");ll.Remove(ll.Find("uno"));//删除foreach(sl中的字符串项){Console.WriteLine(item);}控制台.ReadKey();这是从C#解决方案中的LinkedList中删除节点的解决方法。根据列表项的索引值从单个LinkedList中删除特定节点。下面是代码publicvoidDeleteNode(intnodeIndex){intindexCounter=0;节点TempNode=StartNode;节点PreviousNode=null;while(TempNode.AddressHolder!=null){if(indexCounter==nodeIndex){PreviousNode.AddressHolder=TempNode.地址持有人;休息;}索引计数器++;PreviousNode=TempNode;TempNode=TempNode.AddressHolder;完整的代码可以在http://fumycoder.com/2017/09/06/linked-list/上找到理论上,您可以执行此操作以从单个链表中删除任何随机节点:voidRemoveNode(NodetoRemove){toRemove.PointerToSomeValue=toRemove.NextNode.PointerToSomeValue;toRemove.NextNode=toRemove.NextNode.NextNode;但是,您需要小心识别问题。(即,假设它仍在略读旧值(ABA问题),其他人有指向您的节点的链接),并且您需要在列表末尾有一个您绝不能尝试的“标记”(空)节点删除。(因为toRemove.next.next)编辑:显然,PointerToSomeValue是您想要保留在列表中的任何数据。而且你实际上并不是在删除节点,你基本上是在删除列表中的下一个节点,哦,好吧..你明白了它对每个人都有用,需要了解更多有关C#学习教程。希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
