C++ 实现L2-002 链表去重

C++ 实现 L2-002 链表去重的完整攻略:

  1. 链表的数据结构

在开始实现 L2-002 链表去重之前,我们需要实现一个链表的数据结构。链表是一种数据结构,用于存储一系列的元素,并且可以动态地添加或删除该链表中的元素。

在 C++ 中,可以使用结构体或类来实现链表的数据结构。一个链表的结构体应该至少包含两个属性:节点数据和指向下一个节点的指针。在链表中,每个节点都会指向下一个节点,直到最后一个节点指向 NULL。

示例代码:

struct ListNode {
    int val; // 节点数据
    ListNode *next; // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {} // 构造函数,用于初始化节点数据和指针
};
  1. 链表去重

在实现链表去重之前,需要对链表进行排序,以便后续去重时只需要比较相邻的节点。链表可以使用插入排序或者归并排序进行排序,这里我们使用归并排序。

示例代码:

// 归并排序
ListNode* sortList(ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }
    ListNode *slow = head, *fast = head->next;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    ListNode *right = sortList(slow->next);
    slow->next = NULL;
    ListNode *left = sortList(head);
    return mergeList(left, right);
}

// 合并两个有序链表
ListNode* mergeList(ListNode* l1, ListNode* l2) {
    ListNode *dummy = new ListNode(0);
    ListNode *prev = dummy;
    while (l1 != NULL && l2 != NULL) {
        if (l1->val < l2->val) {
            prev->next = l1;
            l1 = l1->next;
        } else {
            prev->next = l2;
            l2 = l2->next;
        }
        prev = prev->next;
    }
    if (l1 != NULL) {
        prev->next = l1;
    }
    if (l2 != NULL) {
        prev->next = l2;
    }
    return dummy->next;
}

// 链表去重
ListNode* deleteDuplicates(ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }
    ListNode *cur = head;
    while (cur != NULL && cur->next != NULL) {
        if (cur->val == cur->next->val) {
            ListNode *tmp = cur->next;
            cur->next = cur->next->next;
            delete tmp;
        } else {
            cur = cur->next;
        }
    }
    return head;
}

在使用归并排序对链表进行排序之后,我们可以使用一个指针 cur 依次遍历链表。对于每个节点,如果它与后一个节点的值相同,就删除后一个节点,并更新指针;否则,继续向下遍历。

  1. 示例说明

以下是两个示例说明。

示例 1:

假设有一个链表:1 -> 2 -> 2 -> 3 -> 4 -> 4 -> 5

首先,使用归并排序对链表进行排序,得到:1 -> 2 -> 2 -> 3 -> 4 -> 4 -> 5

接下来,使用指针 cur 遍历链表,当 cur 指向节点 2 时,发现它与后一个节点 2 的值相同,因此删除节点 2 并且更新指针,得到链表:1 -> 2 -> 3 -> 4 -> 4 -> 5

继续遍历,当 cur 指向节点 4 时,发现它与后一个节点 4 的值相同,因此删除节点 4 并且更新指针,得到链表:1 -> 2 -> 3 -> 4 -> 5

最终得到的链表为:1 -> 2 -> 3 -> 4 -> 5

示例 2:

假设有一个链表:1 -> 1 -> 1 -> 2 -> 3

首先,使用归并排序对链表进行排序,得到:1 -> 1 -> 1 -> 2 -> 3

接下来,使用指针 cur 遍历链表,当 cur 指向节点 1 时,发现它与后一个节点 1 的值相同,因此删除节点 1 并且更新指针,得到链表:1 -> 2 -> 3

继续遍历,当 cur 指向节点 2 时,发现它与后一个节点 3 的值不相同,因此继续向下遍历。

最终得到的链表为:1 -> 2 -> 3

以上就是 C++ 实现 L2-002 链表去重的攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 实现L2-002 链表去重 - Python技术站

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

相关文章

  • 浅谈Vue2.0父子组件间事件派发机制

    浅谈Vue2.0父子组件间事件派发机制 父子组件通信 在Vue中,父子组件通过props和$emit的方式进行通信。props是从父组件向子组件传递数据的方式,而$emit则是从子组件向父组件传递事件的方式。 父组件通过props向子组件传递值: <template> <div> <ChildComponent :value=&…

    other 2023年6月27日
    00
  • php自动加载规范psr4(thinkphp)

    PHP 自动加载规范 PSR-4(ThinkPHP) 什么是自动加载 在 PHP 开发中,需要引入不同的类和库文件,传统的方式是使用 include 或者 require 函数来加载。这种方式虽然简单易用,但是在项目代码量庞大时,频繁使用 include 或者 require 函数会导致程序运行效率低下,甚至会影响网站访问速度。 PHP 自动加载是一种常见的…

    其他 2023年3月29日
    00
  • 百度cdn公共库

    百度CDN公共库 百度CDN公共库是一个免费的托管开源代码的资源库,供开发人员在其网站和应用程序中使用。它由百度提供,并根据MIT许可证分发。这意味着,作为网站和开发人员,您可以免费使用和分发其中存储的资源,包括JavaScript、CSS、图像、字体等等。 为什么要使用CDN公共库? 使用CDN公共库有以下几个好处: 加载速度更快:CDN公共库使用广泛,有…

    其他 2023年3月29日
    00
  • nginx配置域名访问时域名后出现两个斜杠//的解决方法

    当使用nginx配置域名访问时,有时候会出现域名后面出现两个斜杠//的情况。这通常是由于nginx的配置文件中的配置错误导致的。下面是完整的攻略,包括解决方法和示例说明。 解决方法 出现域名后面出现两个斜杠//的情况,通常因为nginx配置文件中的server_name设置不正确。为了避免这个问题,我们需要在server_name设置中使用绝对路径。具体步骤…

    other 2023年6月27日
    00
  • java递归实现树形结构数据完整案例

    下面是Java递归实现树形结构数据的完整攻略。 什么是树形结构 树形结构是一种常见的数据结构,它由树根、树枝和叶子节点组成。树根是树的起始点,树枝表示节点之间的关系,叶子节点是没有子节点的节点。 递归实现树形结构数据 在Java中,我们可以使用递归算法来实现树形结构数据。 定义节点类 首先,我们需要定义节点类,它包含节点的名称、节点的父节点、节点的子节点等信…

    other 2023年6月27日
    00
  • phpstr_split()函数语法

    phpstr_split()函数语法 在PHP中,字符串(str)是一种常见的数据类型。然而,在处理字符串时,有时需要将字符串的每个字符分割开来,以便进一步处理或展示。 这时,str_split() 函数就派上用场了。该函数可以将字符串分割为单个字符,并将字符存储在数组中。本着学以致用的原则,接下来我们来学习 str_split() 函数的语法和使用方法。 …

    其他 2023年3月29日
    00
  • Android ViewModel创建不受横竖屏切换影响原理详解

    当Android设备发生横竖屏切换时,Activity会被销毁并被重新创建。这意味着,如果我们在Activity中存储数据,则这些数据将会丢失。如果我们使用ViewModel来存储数据,则这些数据将在Activity重新创建后仍然存在,因为ViewModel实例并不受Activity的生命周期影响。 以下是如何创建一个不受横竖屏切换影响的ViewModel的…

    other 2023年6月27日
    00
  • Service_name 和Sid的区别

    Service_name 和 Sid 的区别 在计算机网络中,Service_name 和 Sid 都是用于标识服务的名称。虽然它们都是用于标识服务的名称,但它之间有一些区别。在本攻略中,我们将介绍 Service_name 和 Sid 的区别,包括它们的定义、使用和示例说明等内容,并提供两个示例说明。 Service_name 的定义和使用 Service…

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