📜  C++ 中的链表 (1)

📅  最后修改于: 2023-12-03 14:59:48.600000             🧑  作者: Mango

C++中的链表

链表(Linked List)是一种常见的数据结构,在C++中也有相应的实现。链表是由节点(Node)组成,每个节点包含数据(Data)和指向下一个节点的指针(Next)。相比于数组,在插入和删除操作上,链表的效率更高。

定义链表节点

链表的每个节点可以通过自定义结构体或类来定义。例如,我们定义一个简单的链表节点结构体:

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

每个链表节点有一个整数值(val)和指向下一个节点的指针(next)。

创建链表

要创建链表,我们需要创建节点并将它们连接起来。通常,我们会定义一个指向链表头节点的指针,以便于对链表的操作。以下是一个示例:

ListNode* createLinkedList(vector<int>& nums) {
    ListNode* dummy = new ListNode(0);  // 创建一个虚拟头节点
    ListNode* curr = dummy;  // 指向当前节点

    for (int num : nums) {
        curr->next = new ListNode(num);  // 创建一个新的节点
        curr = curr->next;  // 移动到下一个节点
    }

    return dummy->next;  // 返回链表的实际头节点
}

在上面的代码中,我们使用了一个虚拟头节点(dummy)来简化链表的操作。虚拟头节点的next指针指向实际的头节点。

遍历链表

链表的遍历可以通过循环来实现。通常,我们使用一个指针(或迭代器)来遍历整个链表,直到指针到达链表末尾(即指针为空)。

以下是一个示例,展示了如何遍历链表并打印节点的值:

void traverseLinkedList(ListNode* head) {
    ListNode* curr = head;

    while (curr != nullptr) {
        cout << curr->val << " ";
        curr = curr->next;
    }
}
插入节点

在链表中插入一个新的节点通常有两种方式:在头部插入和在尾部插入。

头部插入

要在链表头部插入一个新的节点,我们只需创建一个新的节点,并将其next指针指向当前的头节点。以下是一个示例:

ListNode* insertAtHead(ListNode* head, int val) {
    ListNode* newNode = new ListNode(val);
    newNode->next = head;
    return newNode;  // 返回新的头节点
}
尾部插入

要在链表尾部插入一个新的节点,我们需要找到链表的末尾节点,然后将其next指针指向新的节点。以下是一个示例:

void insertAtTail(ListNode* head, int val) {
    ListNode* newNode = new ListNode(val);
    ListNode* curr = head;

    while (curr->next != nullptr) {
        curr = curr->next;
    }

    curr->next = newNode;  // 将新节点连接到链表末尾
}
删除节点

删除链表中的一个节点通常有两种方式:删除指定值的节点和删除指定位置的节点。

删除指定值的节点

要删除链表中指定值的节点,我们需要找到该节点,并将其前一个节点的next指针指向其下一个节点。以下是一个示例:

ListNode* deleteNode(ListNode* head, int val) {
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    ListNode* curr = dummy;

    while (curr->next != nullptr) {
        if (curr->next->val == val) {
            ListNode* temp = curr->next;
            curr->next = temp->next;
            delete temp;
        } else {
            curr = curr->next;
        }
    }

    return dummy->next;
}
删除指定位置的节点

要删除链表中指定位置的节点,我们需要找到该位置的前一个节点,并将其next指针指向下一个节点。以下是一个示例:

ListNode* deleteNodeAtPos(ListNode* head, int pos) {
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    ListNode* curr = dummy;

    for (int i = 0; i < pos - 1; i++) {
        curr = curr->next;
    }

    ListNode* temp = curr->next;
    curr->next = temp->next;
    delete temp;

    return dummy->next;
}
总结

链表是一种常见的数据结构,在C++中可以通过自定义结构体或类来实现。使用链表可以高效地进行插入和删除操作。本文介绍了如何定义链表节点、创建链表、遍历链表以及插入和删除节点的方法。

以上为C++中链表的简要介绍,希望对程序员们有所帮助。链表在算法和数据结构中有广泛的应用,进一步学习和掌握链表会对你的程序开发能力有所提升。