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

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

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

#include <iostream>
using namespace std;

struct ListNode
{
    int val;
    struct ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int v) : val(v), next(nullptr) {}
};

struct LinkedList
{
    struct ListNode *head;
    int size;

    LinkedList()
    {
        head = new ListNode;
        size = 0;
    }
    void add_front(int v)
    {
        auto node = new ListNode(v);
        if (node == nullptr) return;
        ListNode *next_node = head->next;
        head->next = node;
        node->next = next_node;
        size++;
    }

    ListNode* find_node(int v)
    {
        ListNode *curr = head->next;
        while (curr != nullptr) {
            if (curr->val == v) return curr;
            curr = curr->next;
        }
        return nullptr;
    }

    ListNode* find_prev(int v)
    {
        ListNode *curr = head;
        while (curr != nullptr && curr->next != nullptr) {
            if (curr->next->val == v) return curr;
            curr = curr->next;
        }
        return nullptr;
    }

    void add_behind_node(int a, int b)
    {
        ListNode *target = find_node(a);
        if (target == nullptr) return;
        ListNode *next_node = target->next;
        if (find_node(b) != nullptr) return;
        auto new_node = new ListNode(b);
        if (new_node == nullptr) return;
        target->next = new_node;
        new_node->next = next_node;
        size++;
    }

    void del_node(int v)
    {
        ListNode *prev_node = find_prev(v);
        if (prev_node == nullptr) return;
        ListNode *del_node = prev_node->next;
        if (del_node == nullptr) return;
        ListNode *nxt_node = del_node->next;
        prev_node->next = nxt_node;
        delete del_node;
    }

    void print_all()
    {
        ListNode *curr = head->next;
        while (curr != nullptr) {
            cout << curr->val << " ";
            curr = curr->next;
        }
        cout << endl;
    }

    ~LinkedList()
    {
        ListNode *curr = head;
        while (curr != nullptr) {
            ListNode *del_node = curr;
            curr = curr->next;
            delete del_node;
            size--;
        }
    }
};

int main() {
    LinkedList linked_list;
    int n, h;
    cin >> n >> h;
    linked_list.add_front(h);
    while (n-- > 0) {
        int a, b;
        cin >> a >> b;
        linked_list.add_behind_node(b, a);
    }
    int k;
    cin >> k;
    linked_list.del_node(k);
    linked_list.print_all();
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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