1 条题解

  • 0
    @ 2026-8-19 9:50:29

    题解

    删除链表结点时,最麻烦的是“要删除首结点”。

    可以使用一个哨兵结点 dummy 放在真正 head 前面:

    dummy -> head -> ...
    

    这样无论删除的是不是原来的首结点,都可以统一处理:

    • 如果 p->next->data == x,删除 p->next;
    • 否则 p=p->next。

    注意删除后不要立刻移动 p,因为新的 p->next 仍可能等于 x。

    #include <bits/stdc++.h>
    using namespace std;
    
    struct Node {
        long long data;
        Node* next;
    };
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
    
        Node dummy{0,nullptr};
        Node* tail=&dummy;
    
        for (int i=0;i<n;++i) {
            long long v; cin >> v;
            tail->next=new Node{v,nullptr};
            tail=tail->next;
        }
    
        long long x;
        cin >> x;
    
        Node* p=&dummy;
        while (p->next) {
            if (p->next->data==x) {
                Node* t=p->next;
                p->next=t->next;
                delete t;
            } else {
                p=p->next;
            }
        }
    
        if (!dummy.next) {
            cout << "Empty\n";
        } else {
            bool first=true;
            for (Node* cur=dummy.next;cur;cur=cur->next) {
                if (!first) cout << ' ';
                first=false;
                cout << cur->data;
            }
            cout << '\n';
        }
    
        while (dummy.next) {
            Node* t=dummy.next;
            dummy.next=t->next;
            delete t;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    5148
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者