c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等)

创建双向链表示例

创建双向链表需要实现以下几个步骤:

  1. 定义双向链表节点结构体 Node,包含 data 数据项和 prevnext 指针分别指向前驱节点和后继节点。
  2. 定义双向链表结构体 LinkedList,包含头节点 head 和尾节点 tail,以及链表长度 size
  3. 实现 LinkedList 的构造函数,初始化头节点和尾节点,并将 headtailprevnext 指向彼此。
  4. 实现 LinkedListinsertAtTail() 方法,在链表尾部插入节点。
  5. 实现 LinkedListinsertAtHead() 方法,在链表头部插入节点。
  6. 实现 LinkedListremoveItem() 方法,删除指定节点。

以下是一个完整的 C++ 双向链表示例代码:

#include<iostream>

// 双向链表节点结构体
struct Node {
    int data;
    Node *prev;
    Node *next;
};

// 双向链表结构体
class LinkedList {
    private:
        Node *head;
        Node *tail;
        int size;

    public:
        // 构造函数
        LinkedList() {
            head = new Node();
            tail = new Node();
            head->next = tail;
            tail->prev = head;
            size = 0;
        }

        // 在链表尾部插入节点
        void insertAtTail(int value) {
            Node *node = new Node();
            node->data = value;
            node->prev = tail->prev;
            node->next = tail;
            tail->prev->next = node;
            tail->prev = node;
            size++;
        }

        // 在链表头部插入节点
        void insertAtHead(int value) {
            Node *node = new Node();
            node->data = value;
            node->prev = head;
            node->next = head->next;
            head->next->prev = node;
            head->next = node;
            size++;
        }

        // 删除指定节点
        void removeItem(Node *node) {
            node->prev->next = node->next;
            node->next->prev = node->prev;
            delete node;
            size--;
        }

        // 获取链表长度
        int getSize() {
            return size;
        }
};

int main() {
    // 创建双向链表并在尾部插入数据
    LinkedList list;
    list.insertAtTail(1);
    list.insertAtTail(2);
    list.insertAtTail(3);
    list.insertAtTail(4);

    // 遍历打印链表中的数据
    Node *currNode = list.head->next;
    while(currNode != list.tail) {
        std::cout << currNode->data << " ";
        currNode = currNode->next;
    }
    std::cout << std::endl;
    return 0;
}

双向链表中查找数据和插入数据示例

双向链表中查找数据和插入数据有多种方式,以下列举其中两种方法:

方法一:遍历查找和插入

遍历双向链表查找节点和插入节点是最基础的方法。遍历链表时从头节点开始向后遍历,直到找到目标节点或遍历到链表尾部。

以下是具体实现代码:

// 查找指定值的节点
Node *findItem(LinkedList &list, int value) {
    Node *currNode = list.head->next;
    while(currNode != list.tail) {
        if(currNode->data == value) {
            return currNode;
        }
        currNode = currNode->next;
    }
    return nullptr;
}

// 在指定值的节点后插入新节点
void insertAfter(LinkedList &list, int value, int newValue) {
    Node *currNode = list.head->next;
    while(currNode != list.tail) {
        if(currNode->data == value) {
            Node *newNode = new Node();
            newNode->data = newValue;
            newNode->prev = currNode;
            newNode->next = currNode->next;
            currNode->next->prev = newNode;
            currNode->next = newNode;
            list.size++;
            break;
        }
        currNode = currNode->next;
    }
}

方法二:使用哈希表优化查找和插入

使用哈希表优化查找和插入是一个常见的优化方法,可以在 O(1) 的时间复杂度内完成节点的查找和插入。

以下代码展示了如何使用 unordered_map(哈希表)实现快速查找和插入:

#include <unordered_map>

// 保存链表节点指针的哈希表
std::unordered_map<int, Node *> hashMap;

// 初始化哈希表
void initHashMap(LinkedList &list) {
    Node *currNode = list.head->next;
    while(currNode != list.tail) {
        hashMap[currNode->data] = currNode;
        currNode = currNode->next;
    }
}

// 查找指定值的节点
Node *findItem(LinkedList &list, int value) {
    if(hashMap.find(value) != hashMap.end()) {
        return hashMap[value];
    }
    return nullptr;
}

// 在指定值的节点后插入新节点
void insertAfter(LinkedList &list, int value, int newValue) {
    Node *currNode = findItem(list, value);
    if(currNode != nullptr) {
        Node *newNode = new Node();
        newNode->data = newValue;
        newNode->prev = currNode;
        newNode->next = currNode->next;
        currNode->next->prev = newNode;
        currNode->next = newNode;
        hashMap[newValue] = newNode;
        list.size++;
    }
}

以上两种方法根据实际场景进行选择,有时更基础的遍历法可能性能更高。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等) - Python技术站

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

相关文章

  • 关于权限:windowschmod600

    在Windows系统中,没有chmod命令,但是可以使用Windows的访问控制列表(ACL)来实现类似的权限管理。本文将详细讲解在Windows中使用ACL实现chmod 600的攻略,包括使用方法和示例说明。 Windows中使用ACL实现chmod 600 在Windows中,可以使用icacls命令来修改文件或目录的ACL权限。要实现chmod 60…

    other 2023年5月7日
    00
  • Android自定义控件实现九宫格解锁功能

    Android自定义控件实现九宫格解锁功能攻略 介绍 九宫格解锁功能是一种常见的安全验证方式,用户需要在九宫格中按照预定的规则连接特定的点来解锁。本攻略将详细讲解如何使用Android自定义控件实现九宫格解锁功能。 步骤 步骤一:创建自定义控件 首先,我们需要创建一个自定义控件来展示九宫格,并处理用户的手势操作。以下是一个简单的示例代码: public cl…

    other 2023年8月20日
    00
  • 浅谈Spring嵌套事务是怎么回滚的

    浅谈Spring嵌套事务是怎么回滚的 Spring框架提供了强大的事务管理功能,其中包括嵌套事务的支持。嵌套事务是指在一个事务中可以包含多个子事务,每个子事务都有自己的独立回滚点。当嵌套事务发生异常时,Spring会根据事务的传播行为和异常类型来决定回滚的策略。 事务传播行为 在Spring中,事务的传播行为定义了事务方法与已存在事务方法的关系。常见的传播行…

    other 2023年7月28日
    00
  • 服务器常见的11种基本故障及排查方法汇总介绍

    服务器常见的11种基本故障及排查方法汇总介绍 在运维服务器过程中,会遇到各种各样的故障,有些是常见的。下面我们来介绍11种常见的故障,以及如何排查和解决这些故障。 1. 主机SSH无法连接 当主机SSH无法连接时,很可能是防火墙的问题。这时候,可以使用以下指令检查防火墙设置: systemctl status firewalld.service 如果防火墙是…

    other 2023年6月27日
    00
  • ActiveX控件的使用-js实现打印超市小票功能代码详解

    下面是关于 “ActiveX控件的使用-js实现打印超市小票功能代码详解” 的完整攻略。 什么是 ActiveX 控件 ActiveX 控件是一种微软开发的对象、组件技术,它实际上是 COM 技术的一种实现。ActiveX 控件通常使用 Visual Basic 或 C++ 等编程语言开发,可以在 Web 页面或可执行文件中嵌入使用。 使用 ActiveX …

    other 2023年6月27日
    00
  • php判断是否包含在某个字符串中

    PHP判断是否包含在某个字符串中 在PHP编程中,判断某个字符串是否包含在另一个字符串中是一个常见的需求。本文将介绍PHP中判断字符串是否包含的几种方法。 1. strpos函数 PHP内置函数strpos()可以快速找到一个字符串在另一个字符串中首次出现的位置。如果strpos()返回的值不是false则表示目标字符串存在,否则表示不存在。 $str = …

    其他 2023年3月28日
    00
  • ps怎么初始化设置? ps切图设置的详细教程

    PS即Photoshop,是一款常用的图像处理软件。在使用PS进行图像处理的时候,初始化设置和切图设置是非常重要的。下面是PS初始化设置和切图设置的详细攻略。 PS初始化设置 步骤一:打开Photoshop 点击开始菜单或Dock栏中的Photoshop图标来打开Photoshop。 步骤二:选择新建文件 在Photoshop中选择“文件” > “新建…

    other 2023年6月20日
    00
  • 浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解 MySQL中的授权(grant)和撤销授权(revoke)是用于管理用户权限的重要命令。授权允许用户执行特定的操作,而撤销授权则取消了用户的权限。本文将详细介绍这两个命令的用法,并提供两个示例说明。 授权(grant)命令用法 授权命令用于给用户赋予特定的权限。其基本语法如下: GRANT…

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