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

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

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

#include <iostream>
using namespace std;

//节点类
class Node {
  private:
    int data;
    Node* next;

  public:
    //构造函数
    Node(const int data, Node* next = NULL);

    //析构函数
    ~Node();

    //获取节点值
    const int getData(void);

    //获取指针值(返回对指针的引用,便于修改)
    Node*& Next(void);
};

Node::Node(const int data, Node* next) {
    this->data = data;
    this->next = next;
    return;
}

Node::~Node() {
}

const int Node::getData(void) {
    return this->data;
}

Node*& Node::Next(void) {
    // TODO: 在此处插入 return 语句
    return this->next;
}

//链表类
class List {
  private:
    //头节点
    Node* head;

    //长度
    int length;

  private:
    //复制构造函数私有化,避免浅拷贝
    List(const List&);

  public:
    //构造函数
    List(const int num, const int data);

    //析构函数
    ~List();

    //在值为i的节点后插入值为j的节点
    void insert(const int j, const int i);

    //删除值为data的节点
    void del(const int data);

    //输出(<<运算符重载)
    friend ostream& operator<<(ostream& cout, const List& list);
};

List::List(const int num, const int data) {
    this->length = num;
    this->head = new Node(data);

    //插入后续节点
    int a, b;
    for (int i = 1; i < this->length; i++) {
        cin >> a >> b;
        this->insert(a, b);
    }

    //删除节点
    cin >> a;
    this->del(a);
    return;
}

List::~List() {
    Node* p = this->head;
    while (p != NULL) {
        Node* next = p->Next();
        delete p;
        p = next;
        this->length--;
    }
    return;
}

void List::insert(const int j, const int i) {
    Node* previous = this->head;
    while (previous->getData() != i)
        previous = previous->Next();
    previous->Next() = new Node(j, previous->Next());
    return;
}

void List::del(const int data) {
    this->length--;
    Node* previous = this->head;

    //如果头节点就是要删除的节点
    if (this->head->getData() == data) {
        this->head = this->head->Next();
        delete previous;
        return;
    }

    //如果要删除的节点在后面
    while (previous->Next()->getData() != data)
        previous = previous->Next();
    Node* p = previous->Next();
    previous->Next() = previous->Next()->Next();
    delete p;
    return;
}

int main() {
    int a, b;
    while (cin >> a >> b) { // 注意 while 处理多个 case
        List list(a, b);
        cout << list << endl;
    }
}
// 64 位输出请用 printf("%lld")

ostream& operator<<(ostream& cout, const List& list) {
    //如果是空链表
    if (list.head == NULL)
        return cout;

    cout << list.head->getData();
    Node* p = list.head->Next();
    while (p != NULL) {
        cout << ' ' << p->getData();
        p = p->Next();
    }
    // TODO: 在此处插入 return 语句
    return cout;
}

全部评论

相关推荐

谁知道呢_:要掉小珍珠了,库库学三年,这个结果
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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