C++ 自定义单向链表 ListNode详情

下面我将为您详细讲解“C++自定义单向链表ListNode详情”的完整攻略。

一、什么是自定义单向链表?

自定义单向链表是一种数据结构,它是由若干个节点(Node)构成的链式存储结构,其中每个节点都包含一个数据域和一个指针域,指针域指向下一个节点。与数组不同,链表的大小可以动态变化,并且可以随时插入和删除节点。

二、自定义单向链表的实现

1. 定义节点结构体

我们可以使用结构体来定义节点类型,节点应该包含一个数据域和一个指针域,指针域指向下一个节点。下面是一个节点结构体的定义示例:

struct ListNode {
    int val; // 数据域
    ListNode *next; // 指针域
    ListNode(int x) : val(x), next(NULL) {}
};

这个结构体包含了一个int类型的数据val和一个指向ListNode类型的指针next,初始化时next指针为空。

2. 添加节点

在自定义单向链表中,添加节点可以通过将新节点插入到链表的末尾,或者将新节点插入到链表的任意位置。下面是在链表末尾添加新节点的示例代码:

ListNode* addNode(ListNode* head, int val) {
    ListNode *newNode = new ListNode(val);
    ListNode *cur = head;
    while (cur->next != NULL) {
        cur = cur->next;
    }
    cur->next = newNode;
    return head;
}

这个函数接收链表头节点的指针head和待插入节点的值val,返回新的链表头节点的指针。它会遍历整个链表,找到最后一个节点cur,然后在cur的next指针处插入一个新节点newNode。

3. 删除节点

删除节点可以通过遍历链表找到要删除的节点,然后将该节点的前一个节点的next指针指向该节点的后一个节点。下面是在链表中删除指定节点的示例代码:

ListNode* deleteNode(ListNode* head, int val) {
    ListNode *cur = head, *prev = NULL;
    while (cur != NULL && cur->val != val) {
        prev = cur;
        cur = cur->next;
    }
    if (prev == NULL) {
        head = head->next;
    } else {
        prev->next = cur->next;
    }
    delete cur;
    return head;
}

这个函数接收链表头节点的指针head和待删除节点的值val,返回新的链表头节点的指针。它会遍历整个链表,找到要删除的节点cur和该节点的前一个节点prev,然后将prev的next指针指向cur的后一个节点,最后删除cur节点。

三、示例应用

下面给出两个示例:

1. 使用自定义单向链表实现队列

队列是一种先进先出的数据结构,我们可以使用自定义单向链表来实现队列。下面是一些函数的示例实现:

// 队列结构体
struct MyQueue {
    ListNode *front, *rear; // 队列头节点和尾节点
    int size; // 队列大小
    MyQueue() : front(NULL), rear(NULL), size(0) {}
};

// 入队
void queuePush(MyQueue* q, int val) {
    if (q->rear == NULL) { // 队列为空
        q->front = q->rear = new ListNode(val);
    } else {
        q->rear->next = new ListNode(val);
        q->rear = q->rear->next;
    }
    q->size++;
}

// 出队
void queuePop(MyQueue* q) {
    if (q->front == NULL) return;
    ListNode *temp = q->front;
    q->front = q->front->next;
    if (q->front == NULL) {
        q->rear = NULL;
    }
    delete temp;
    q->size--;
}

// 获取队头元素
int queueFront(MyQueue* q) {
    return q->front == NULL ? -1 : q->front->val;
}

// 获取队尾元素
int queueRear(MyQueue* q) {
    return q->rear == NULL ? -1 : q->rear->val;
}

// 判断队列是否为空
bool queueEmpty(MyQueue* q) {
    return q->size == 0;
}

// 获取队列大小
int queueSize(MyQueue* q) {
    return q->size;
}

2. 使用自定义单向链表实现链式哈希表

链式哈希表是一种数据结构,它可以高效地实现查找、插入和删除操作。我们可以使用自定义单向链表来实现链式哈希表中的链表结构。下面是一些函数的示例实现:

// 哈希表结点结构体
struct HashNode {
    int key, value;
    HashNode *next;
    HashNode(int k, int v) : key(k), value(v), next(NULL) {}
};

// 哈希表结构体
struct MyHashMap {
    vector<HashNode*> data;
    const int len = 10000;
    MyHashMap() : data(len) {}

    // 哈希函数
    int hash(int key) {
        return key % len;
    }

    // 获取指定键对应的节点指针
    HashNode* getNode(int key) {
        int id = hash(key);
        HashNode *cur = data[id];
        while (cur != NULL) {
            if (cur->key == key) {
                break;
            }
            cur = cur->next;
        }
        return cur;
    }

    // 插入键值对
    void put(int key, int value) {
        int id = hash(key);
        HashNode *cur = data[id];
        while (cur != NULL) {
            if (cur->key == key) {
                cur->value = value;
                return;
            }
            cur = cur->next;
        }
        HashNode *newNode = new HashNode(key, value);
        newNode->next = data[id];
        data[id] = newNode;
    }

    // 获取指定键对应的值
    int get(int key) {
        HashNode *node = getNode(key);
        return node == NULL ? -1 : node->value;
    }

    // 删除指定键
    void remove(int key) {
        int id = hash(key);
        HashNode *cur = data[id], *prev = NULL;
        while (cur != NULL) {
            if (cur->key == key) {
                if (prev == NULL) {
                    data[id] = cur->next;
                } else {
                    prev->next = cur->next;
                }
                delete cur;
                return;
            }
            prev = cur;
            cur = cur->next;
        }
    }
};

以上是自定义单向链表的详细介绍和应用示例,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 自定义单向链表 ListNode详情 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++的static关键字及变量存储位置总结

    C++的static关键字及变量存储位置总结 在C++中,static关键字用于声明静态变量和静态成员函数。它可以改变变量的存储位置和生命周期。下面是对static关键字及变量存储位置的详细总结。 静态变量的存储位置 静态变量在程序的整个生命周期内都存在,并且存储在静态存储区。静态存储区是在程序启动时分配的一块固定大小的内存区域,直到程序结束时才会释放。静态…

    other 2023年7月29日
    00
  • 魅族flyme4.5.7固件下载 魅族flyme4.5.7稳定版固件下载地址

    魅族Flyme 4.5.7固件下载攻略 1. 确认设备型号和版本 在下载魅族Flyme 4.5.7固件之前,首先需要确认你的设备型号和当前的固件版本。这可以通过以下步骤完成: 打开手机设置菜单。 滚动到底部,找到“关于手机”或类似的选项。 在关于手机页面中,查找设备型号和当前固件版本号。 确保你的设备型号和当前固件版本与魅族Flyme 4.5.7固件的兼容性…

    other 2023年8月4日
    00
  • javascript制作的cookie封装及使用指南

    JavaScript制作的Cookie封装及使用指南 什么是Cookie Cookie是服务器下发到客户端浏览器,由浏览器进行存储的一种数据。通常包括cookie名称,cookie值,过期时间,路径等内容。可以在后续的浏览器请求中提供给服务器进行识别并进行相应的操作。 JavaScript制作Cookie的封装 封装步骤 创建cookie 获取cookie …

    other 2023年6月25日
    00
  • Angular.js之作用域scope’@’,’=’,’&’实例详解

    Angular.js之作用域(scope) ‘@’, ‘=’, ‘&’ 实例详解 Angular.js是一个流行的JavaScript框架,它使用了一种称为作用域(scope)的概念来管理数据和事件。作用域(scope)是一个对象,它将控制器(controller)和视图(view)连接起来,使它们能够相互通信。 在Angular.js中,作用域(s…

    other 2023年8月19日
    00
  • 详解windows下C/C++的内存泄露检测

    对于Windows下C/C++的内存泄露检测,我们一般可以采用以下的步骤: 1. 安装内存泄露检测工具 Windows下比较常用的内存泄漏检测工具有Valgrind、Dr. Memory和Intel Inspector等。其中,本文将以Valgrind为例。在Windows上使用Valgrind工具,我们需要使用一个名为“MSys2”的softwares。我…

    other 2023年6月26日
    00
  • java之lombok的构建者模式Builder中的泛型写法说明

    Java之Lombok的构建者模式Builder中的泛型写法说明 Lombok是一个Java库,它通过注解的方式简化了Java代码的编写。其中,Lombok的构建者模式(Builder)是一种常用的设计模式,用于创建复杂的对象。在构建者模式中,Lombok提供了一种简洁的方式来生成构建者类,以便于创建对象时使用链式调用的方式设置属性。 泛型写法说明 在Lom…

    other 2023年8月6日
    00
  • 浅谈字符串hash

    浅谈字符串hash 在计算机科学中,字符串hash是一种常见的技术,可以用来快速判断两个字符串是否相等。它可以很大程度地提高字符串的比较效率,因为字符串比较的时间复杂度通常是O(n),而使用字符串hash可以将时间复杂度降低到O(1)。 字符串hash的原理 字符串hash的原理很简单,就是将字符串转换为一个数字。具体来说,可以遍历字符串中的每个字符,将每个…

    其他 2023年3月28日
    00
  • matlab-octave/matlab中的deal()函数有什么意义?

    以下是关于“matlab-octave/matlab中的deal()函数有什么意义?”的完整攻略,包括基本概念、用法、示例和注意事项。 基本概念 deal()函数是Matlab/Octave中的一个内置函数,用于将输入参数分配给输出变量。它可以将多个输入参数分配给多个输出变量,也可以将一个输入参数分配给多个输出变量。 用法 deal()函数的基本语法如下: …

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部