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

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

http://www.nowcoder.com/questionTerminal/f96cd47e812842269058d483a11ced4f

题意:由子节点和父节点的关系建立一个单链表,后输入的子节点是父节点的真正的下一个节点,之前的下一个节点后移,视为插入操作。
代码主要包含插入和删除两个子函数。

#include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode* next;
    ListNode(int v, ListNode* p = nullptr) :val(v), next(p) {}
};
//插入节点
void InsertAfter(ListNode* fa, ListNode* ch)
{
    ListNode* succ = fa->next;
    fa->next = ch;
    ch->next = succ;
}
//删除节点,并返回头结点
ListNode* DeleNode(ListNode* head, int val)
{
    ListNode* prev = new ListNode(-1);//前置节点
    prev->next = head;
    head = prev;
    while (head->next)
    {
        if (head->next->val == val)
        {
            head->next = head->next->next;
            break;
        }
        head = head->next;
    }
    return prev->next;
}
int main()
{
    int num = 0, val = 0;
    while (cin >> num >> val)
    {
        ListNode* head = new ListNode(val);
        ListNode* fath = head;
        vector<pair<int, int>> vec;
        int child, father,count = num - 1;
        while (--num)
        {
            cin >> child >> father;
            vec.push_back(make_pair(child, father));
        }
        //构建链表
        while (count)
        {
            for (int i = 0; i < vec.size(); i++)
            {
                //寻找父节点
                if (vec[i].second == fath->val)
                {
                    //构造子节点
                    ListNode* node = new ListNode(vec[i].first);
                    //插入子节点
                    InsertAfter(fath, node);
                    //删除
                    //vec.erase(vec.begin() + i);
                    vec[i] = make_pair(-1, -1);
                    count--;
                }
            }
            fath = fath->next;
        }
        //删除
        int deleval = 0;
        cin >> deleval;
        head = DeleNode(head, deleval);
        fath = head;
        //输出
        while (fath)
        {
            cout << fath->val << " ";
            fath = fath->next;
        }
        cout << endl;
        //销毁
        while (head)
        {
            fath = head->next;
            delete(head);
            head = fath;
        }
    }
    return 0;
}
全部评论
xd,太强了,通俗易懂
点赞 回复 分享
发布于 2021-04-24 11:03

相关推荐

qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
评论
5
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务