📜  单链表的定义 - C++ (1)

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

单链表的定义 - C++

单链表是一种线性数据结构,由多个节点组成,每个节点包括一个值和指向后继节点的指针。它具有动态性和灵活性,可以随时在任意位置进行插入和删除操作。

节点的定义

单链表的每个节点包含两个成员变量:

  • val - 当前节点存储的值
  • next - 指向下一个节点的指针

使用结构体定义单链表节点:

struct ListNode {
    int val;            // 当前节点存储的值
    ListNode *next;     // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}   // 构造函数
};
单链表的操作
创建单链表

首先,我们需要创建一个单链表的头节点,头节点一般不存储任何值。接着,我们用一个指针指向头节点,从这里开始,就可以依次追加节点了。

// 创建单链表
ListNode* createLinkedList(vector<int> nums) {
    ListNode *head = new ListNode(-1);      // 头节点,不存储任何值
    ListNode *cur = head;                   // 指针指向头节点
    for (int i = 0; i < nums.size(); i++) {
        cur->next = new ListNode(nums[i]);  // 新建节点
        cur = cur->next;                    // 指针后移
    }
    return head->next;                      // 返回实际存储节点的头节点
}
遍历单链表
// 遍历单链表
void printLinkedList(ListNode *head) {
    while (head != NULL) {
        cout << head->val << " ";
        head = head->next;
    }
}
插入节点

在单链表的任意位置插入一个节点,需要找到该位置的前一个节点,把它的 next 指针指向新节点,新节点的 next 指针指向后面的节点。

// 在单链表的任意位置插入一个节点
void insertNode(ListNode *head, int index, int value) {
    ListNode *prev = head;
    for (int i = 0; i < index - 1; i++) {
        prev = prev->next;
    }
    ListNode *newNode = new ListNode(value);
    newNode->next = prev->next;
    prev->next = newNode;
}
删除节点

和插入节点一样,删除单链表的任意位置的节点需要找到它的前一个节点,让前一个节点的 next 指针指向下一个节点。这个过程中,需要先判断当前节点是否为空,如果为空直接返回即可。

// 删除单链表的任意位置的节点
void deleteNode(ListNode *head, int index) {
    ListNode *prev = head;
    for (int i = 0; i < index - 1; i++) {
        prev = prev->next;
    }
    ListNode *cur = prev->next;             // 待删除的节点
    if (cur == NULL) return;
    prev->next = cur->next;
    delete cur;
}
总结

以上是单链表的定义和基本操作。单链表是一种重要的数据结构,在算法和设计模式中有广泛的应用。学好单链表的基础知识,对于提高编程能力和解决实际问题都是非常有帮助的。