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

yizhihongxing

下面我将为您详细讲解“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日

相关文章

  • python3对数据库的基本操作

    Python3对数据库的基本操作 Python3提供了许多库来连接和操作各种类型的数据库。在本文中,我们将介绍Python3中对数据库的基本操作,包括连接数据库、创建表、插入数据查询数据、更新数据删除数据。 连接数据库 在Python3中,我们可以使用不同的库来连接不同类型的数据库。以下是一些常用的库: MySQL:-connector-python Pos…

    other 2023年5月9日
    00
  • 用php编写我的第一段代码:helloworld

    以下是用PHP编写“Hello World”程序的完整攻略: 用PHP编写我的第一段代码:Hello World PHP是一种流行的服务器端脚本语言用于开发Web应用程序。以下是编写“Hello World”程序的步骤: 步骤1:安装PHP 在开始编写PHP代码之前,您需要安装PHP。您可以从PHP官方网站下载适用于您操作系统的PHP版本。安装完成后,您可以…

    other 2023年5月7日
    00
  • pythonlist转json

    当然,我很乐意为您提供有关“Python List转JSON”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。它基于JavaScript语言的一个子集,但是可以被多种编语言使用,包括Python。 2. Python List转JSO…

    other 2023年5月6日
    00
  • js继承的6种方式详解

    以下是js继承的六种方式的详细攻略。 1. 原型链继承 原型链继承是JavaScript中最基本的继承方式之一,它通过将父类的实例对象作为子类的原型对象来实现继承。这种方式的缺点是,所有子类实例对象共享同一个原型对象,当父类原型对象中的引用类型属性被修改时,所有子类实例对象中对应属性的值都会同时改变,这个缺点也被称之为“原型污染”问题。 示例代码如下: fu…

    other 2023年6月27日
    00
  • fetchtype.lazy优缺点

    fetchtype.lazy优缺点 什么是fetchtype.lazy 在JPA的@OneToMany和@ManyToMany注解中,有一个属性叫做fetch,用于指定数据的加载方式。其中,fetchtype.lazy表示懒加载方式,以延迟加载数据为代价,从而提高程序的性能。 优点 节省时间和资源 懒加载可以延迟加载数据,只有在需要时才会去加载数据,这样可以…

    其他 2023年3月28日
    00
  • Mysql修改字段类型、长度及添加删除列实例代码

    MySQL是一种常用的关系型数据库管理系统,操作MySQL数据库需要熟悉相关的SQL语句,本文将详细讲解MySQL修改字段类型、长度及添加删除列的实例代码。 修改字段类型 修改表中字段的数据类型可以使用ALTER TABLE语句,语法如下: ALTER TABLE table_name MODIFY column_name new_data_type; 其中…

    other 2023年6月25日
    00
  • 战锤末世鼠疫2游戏卡在初始化界面怎么办?

    当战锤末世鼠疫2游戏卡在初始化界面时,可能是由于安装或配置问题引起的。以下是解决方法的完整攻略: 检查游戏文件 首先,需要检查游戏文件是否完整或出现了错误。通过以下步骤进行检查: 打开Steam 在游戏库中找到战锤末世鼠疫2游戏,右键点击游戏名称 选择“属性” 点击“本地文件”标签 点击“验证游戏文件完整性” 这将检查游戏文件是否完整或出现错误,并自动修复它…

    other 2023年6月20日
    00
  • C++读写INI配置文件的类实例

    下面是“C++读写INI配置文件的类实例”的完整攻略: 一、背景介绍 INI配置文件是一种常见的文本配置文件格式,它使用Section和Key-Value键值对来存储配置信息,广泛应用于各种软件中。在C++开发中,我们可以通过读写INI配置文件的方式来实现软件的配置管理,方便快捷。 二、INI配置文件的基本格式 INI配置文件的基本格式是由Section和K…

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