题解 | #从单向链表中删除指定值的节点#

从单向链表中删除指定值的节点

https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f

#include <iostream>

using namespace std;
struct ListNode{
    int val;
    ListNode* next;
    ListNode(int val):val(val),next(nullptr){}
};
//从index插入节点的函数,再val1后面插入val2的值
ListNode* AddIndex(ListNode * dummyHead,int val1,int val2)
{
    ListNode* cur=dummyHead;
    while(cur!=nullptr&&cur->val!=val1){
        cur=cur->next;
    }
    ListNode* newNode=new ListNode(val2);
    newNode->next=cur->next;
    cur->next=newNode;
    return dummyHead;
}
//删除指定val值的节点
ListNode* DeleteIndex(ListNode* dummyHead,int val1){
    ListNode* cur=dummyHead;
    while(cur!=nullptr&&cur->next!=nullptr&&cur->next->val!=val1){
        cur=cur->next;
    }
    ListNode*tmp=cur->next;
    cur->next=cur->next->next;
    delete tmp;
    tmp=nullptr;
    return dummyHead;
}
//打印当前链表
void PrintList(ListNode* dummyHead){
    ListNode* cur=dummyHead->next;
    while(cur!=nullptr){
        cout<<cur->val<<" ";
        cur=cur->next;
    }
    cout<<endl;
}
int main() {
    int n;
    int val0;
    cin>>n>>val0;
    ListNode* dummyHead=new ListNode(0);
    ListNode* head=new ListNode(val0);
    dummyHead->next=head;
    ListNode* cur=dummyHead;
    while(n-1){//因为head在外面赋值了,接下来循环里要赋值的就是n-1个节点
        int val2,val1;
        cin>>val1>>val2;//在val2的后面插入Val1
        AddIndex(dummyHead,val2,val1);
        //PrintList(dummyHead);
        n--;
    }
    int val3;//删除的值
    cin>>val3;
    DeleteIndex(dummyHead, val3);
    PrintList(dummyHead);




}

注意这道题中的插入数据是在给出的值之后插数据,所以指针遍历链表的时候,可以用当前指针遍历,不需要cur->next遍历。找到要在【其后面】插入节点的那个数字后(比如数组是2,3,是要在val=3的节点后插入2,先遍历链表找这个3在哪里),cur停在val对应的节点上,直接在cur->next的位置放新的节点即可。有些题目的插入是找到val值后在他的【前面】插入一个节点,那此时就需要用cur->next遍历,找到cur->next=val的节点后,cur停在val前一个节点处,才能正确插入。所以遍历的时候要仔细看题目是哪一种插入。

delete就没什么可说的,一定是cur停在val的前一个节点处,让自己的cur->next=cur->next->next,所以一定得是用cur->next来遍历。注意删除之后,C++中需要删除不需要的节点的内存,并将指针赋为空值以免造成野指针

全部评论

相关推荐

白火同学:大二有这水平很牛了,可以适当对关键信息加粗一点,比如关键技术、性能指标之类的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务