欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

单向链表 手写源码

时间:2024-06-21 10:21 作者:admin 点击:
#include iostreamusing namespace std;// 定义链表节点结构体struct Node { int data; // 存储节点数据 Node* next; // 指向下一个节点的指针 Node(int val) : data(val), next(nullptr) {} // 构造函数};// 定义单向链表类
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct Node {
    int data; // 存储节点数据
    Node* next; // 指向下一个节点的指针

    Node(int val) : data(val), next(nullptr) {} // 构造函数
};

// 定义单向链表类
class LinkedList {
private:
    Node* head; // 链表的头指针

public:
    LinkedList() : head(nullptr) {} // 构造函数

    // 析构函数,释放链表内存
    ~LinkedList() {
        Node* current = head;
        while (current != nullptr) {
            Node* next = current->next;
            delete current;
            current = next;
        }
    }

    // 在链表末尾添加新节点
    void append(int value) {
        Node* newNode = new Node(value);
        if (head == nullptr) {
            head = newNode;
        } else {
            Node* temp = head;
            while (temp->next != nullptr) {
                temp = temp->next;
            }
            temp->next = newNode;
        }
    }

    // 在链表头部添加新节点
    void prepend(int value) {
        Node* newNode = new Node(value);
        newNode->next = head;
        head = newNode;
    }

    // 根据值查找节点
    Node* find(int value) {
        Node* current = head;
        while (current != nullptr) {
            if (current->data == value) {
                return current;
            }
            current = current->next;
        }
        return nullptr;
    }

    // 删除指定值的节点
    bool remove(int value) {
        Node* current = head;
        Node* previous = nullptr;

        while (current != nullptr) {
            if (current->data == value) {
                if (previous == nullptr) {
                    head = current->next;
                } else {
                    previous->next = current->next;
                }
                delete current;
                return true;
            }
            previous = current;
            current = current->next;
        }
        return false;
    }

    // 更新节点的值
    bool update(int oldValue, int newValue) {
        Node* node = find(oldValue);
        if (node != nullptr) {
            node->data = newValue;
            return true;
        }
        return false;
    }

    // 打印链表
    void print() {
        Node* current = head;
        while (current != nullptr) {
            cout << current->data << " -> ";
            current = current->next;
        }
        cout << "null" << endl;
    }
    
    // 在指定节点之后插入新节点
    bool insertAfter(Node* prevNode, int value) {
        if (prevNode == nullptr) {
            std::cout << "The given previous node cannot be NULL" << std::endl;
            return false;
        }

        Node* newNode = new Node(value);
        newNode->next = prevNode->next;
        prevNode->next = newNode;

        return true;
    }
};

int main() {
    LinkedList list;
    list.append(1);
    list.append(2);
    list.append(3);
    list.prepend(0);
    list.print(); // 打印链表

    list.remove(2);
    list.print(); // 打印删除节点后的链表

    list.update(0, -1);
    list.print(); // 打印更新节点后的链表
    
	// 找到节点3,然后在这个节点之后插入节点4
    Node* nodeToInsertAfter = list.find(3);
    if (nodeToInsertAfter != nullptr) {
        list.insertAfter(nodeToInsertAfter, 4);
    }

    list.print(); // 打印链表
    return 0;
}


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%