五个经典链表OJ题带你进阶C++链表篇

五个经典链表OJ题带你进阶C++链表篇

前言

链表作为一种非常重要的数据结构,常常用来解决一些实际问题。在代码中,我们需要用到链表时,不能只是会使用,而是要掌握它的一些经典问题,才能真正了解链表的一些相关性质和应用。本篇攻略介绍了五个经典的链表OJ题,通过解析这些问题,帮助初学者进阶学习C++链表。

问题一:求链表的长度

输入一个单链表,输出链表的长度。

算法描述:

  1. 定义一个计数器count,初始值为0
  2. 从头节点开始,遍历链表
  3. 每经过一个节点,计数器+1
  4. 遍历完整个链表后,返回count的值

代码实现:

int getLength(ListNode* head) {
    int count = 0;
    ListNode* cur = head;
    while (cur != nullptr) {
        count++;
        cur = cur->next;
    }
    return count;
}

问题二:链表的倒数第K个节点

输入一个单链表,输出该链表的倒数第K个节点。假设该链表的长度未知,但是保证k不大于链表的长度。

算法描述:

  1. 使用双指针法,定义fast指针和slow指针
  2. fast指针先向前移动k步,此时,slow指针和fast指针之间的距离为k
  3. 同时移动slow指针和fast指针,直到fast指针指向链表的最后一个节点
  4. 返回slow指针指向的节点即可

代码实现:

ListNode* getKthFromEnd(ListNode* head, int k) {
    ListNode* fast = head;
    ListNode* slow = head;
    while (k > 0 && fast != nullptr) {
        fast = fast->next;
        k--;
    }
    while (fast != nullptr) {
        fast = fast->next;
        slow = slow->next;
    }
    return slow;
}

示例:假设链表为1->2->3->4->5,k=2。

  1. fast指针先向前移动2步,此时fast指针指向3,slow指针指向1
  2. 同时移动slow指针和fast指针,当fast指针指向5时,slow指针指向4
  3. 返回slow指针指向的节点4

问题三:翻转链表

输入一个单链表的头节点,反转该链表并输出反转后链表的头节点。

算法描述:

  1. 定义三个指针:pre指向前一个节点,cur指向当前节点,temp指向当前节点的下一个节点
  2. 遍历链表,同时在遍历的过程中进行指针的修改
  3. 每次修改完指针之后pre指针和cur指针同时向前移动一位,temp指针指向cur指针的下一个节点
  4. 遍历结束后,返回pre指针即可

代码实现:

ListNode* reverseList(ListNode* head) {
    ListNode* pre = nullptr;
    ListNode* cur = head;
    while (cur != nullptr) {
        ListNode* temp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;
}

示例:假设链表为1->2->3->4->5。

  1. 初始时,pre指针为空,cur指针指向1,temp指针指向2
  2. 当前指针cur指向的节点1,它的下一个节点指向pre节点(pre节点为空)
  3. 同时,pre指针指向了cur指针指向的节点1,cur指针指向了temp指针所指向的下一个节点2
  4. 第一次循环结束,链表变成了2->1->null
  5. 重复2-4步骤,直到遍历完整个链表,返回pre指针指向的节点5。

问题四:链表删除操作

输入一个单链表和要删除的节点所在的指针,将该指针指向的节点从链表中删除并返回链表的头节点。

算法描述:

  1. 如果要删除的是头节点,直接返回head->next
  2. 找到要删除节点的前一个节点pre
  3. 将pre的next指向要删除节点的下一个节点
  4. 返回head指针即可

代码实现:

ListNode* deleteNode(ListNode* head, ListNode* node) {
    if (head == node) {
        return head->next;
    }
    ListNode* cur = head;
    while (cur->next != nullptr && cur->next != node) {
        cur = cur->next;
    }
    if (cur->next == node) {
        cur->next = node->next;
    }
    return head;
}

问题五:判断链表是否有环

给定一个链表,判断链表中是否有环。

算法描述:

  1. 定义快指针fast和慢指针slow,将它们初始指向链表的头节点
  2. fast指针每次移动两步,slow指针每次移动一步
  3. 在遍历的过程中,如果快指针指向了nullptr,说明链表无环;如果快指针和慢指针指向的是同一个节点,那么链表有环
  4. 返回布尔值即可

代码实现:

bool hasCycle(ListNode* head) {
    ListNode* fast = head;
    ListNode* slow = head;
    while (fast != nullptr && fast->next != nullptr) {
        fast = fast->next->next;
        slow = slow->next;
        if (fast == slow) {
            return true;
        }
    }
    return false;
}

以上就是五个经典链表OJ题的完整攻略。通过对这些问题的解析,可以帮助初学者进阶C++链表,提高自己的编程水平。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:五个经典链表OJ题带你进阶C++链表篇 - Python技术站

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

相关文章

  • 微信小程序实战之上拉(分页加载)效果(2)

    微信小程序实战之上拉(分页加载)效果(2)是一篇关于如何实现上拉分页加载的教程。本文主要讲解如何利用小程序的API和组件实现上拉分页加载功能。下面是本文中的详细攻略: 创建页面 要实现上拉分页加载功能,首先需要在小程序中创建一个页面。在创建页面的时候,可以使用小程序提供的 Page 构造函数来创建一个页面对象。在创建页面对象之后,需要在页面的 onLoad …

    other 2023年6月25日
    00
  • 关于opengl:使用glblitframebuffer显示纹理

    下面是关于“使用glBlitFramebuffer显示纹理”的完整攻略,包括步骤和示例说明。 简介 glBlitFramebuffer是OpenGL中的函数,用将一个帧缓冲区的内容复制到另一个帧缓冲区。它可以用于将一个帧缓冲区的内容显示到屏上,也可以于将一个帧缓冲区的内容复制到另一个帧缓冲区中。 步骤 下面是使用glBlitFramebuffer显示纹理的步…

    other 2023年5月8日
    00
  • ASP.NET MVC学习之NuGet在VS中的运用浅谈

    以下是使用标准的Markdown格式文本,详细讲解ASP.NET MVC学习之NuGet在VS中的运用的完整攻略: ASP.NET MVC学习之NuGet在VS中的运用浅谈 NuGet是一个用于管理和安装第三方库和工具的包管理器,它可以帮助我们轻松地引入和更新项目所需的依赖项。在ASP.NET MVC开发中,NuGet是一个非常有用的工具,可以简化我们的开发…

    other 2023年10月14日
    00
  • js操作剪切板

    js操作剪切板 在现代Web开发中,常常需要通过复制、粘贴剪切板内容来提升用户体验。JavaScript提供了一种简单的方法来访问浏览器剪贴板并执行相关操作。 判断浏览器是否支持操作剪贴板 在进行如下操作之前,我们需要明确当前浏览器是否支持剪贴板操作。这里我们可以通过 document.queryCommandSupported()方法来判断某个指定命令是否…

    其他 2023年3月28日
    00
  • LINUX安全运维之:文件系统的权限修改与安全设置

    LINUX安全运维之:文件系统的权限修改与安全设置 一、权限基础知识 为了保护系统安全,Linux文件系统采用了访问权限的方式控制对文件和文件夹的读写操作。Linux文件的权限信息包含了三个部分: 用户权限:可访问文件的用户或用户组。分别被分为文件属主(owner)、所在组(group)以及其他人(other)。 文件权限:包括读、写、执行三类权限。 特殊权…

    other 2023年6月27日
    00
  • Favoritevideo是什么文件夹?如何删除Favoritevideo文件夹?

    Favoritevideo是一个文件夹,通常存放着用户最喜爱的视频,可以在不同的软件或设备上找到。如果你想删除这个文件夹,可以按照下面的步骤进行操作: 1. 手动删除 如果您在计算机上保存了Favoritevideo文件夹,则可以通过以下步骤手动删除该文件夹: 打开文件资源管理器并找到Favoritevideo文件夹的位置。 右键单击文件夹并选择“删除”。 …

    other 2023年6月27日
    00
  • linuxcentos7find命令

    linuxcentos7find命令 在Linux操作系统中,find命令是非常有用的搜索工具。它可以帮助我们在特定目录下搜索文件并返回符合我们指定条件的文件列表。在本文中,我们将主要介绍find命令在CentOS 7系统中的应用。 安装与基本用法 在CentOS 7中,find命令运行时不需要安装。我们可以在命令行下以以下方式使用这个命令: find /p…

    其他 2023年3月29日
    00
  • androidstudio中常用设置与快捷键

    Android Studio中常用设置与快捷键 Android Studio是一款官方提供的Android开发工具,它是以IntelliJ为基础打造的,具备了强大的Java开发功能和突出的Android应用开发能力。而在Android Studio中,常用的设置与快捷键可以帮助我们更加高效地完成开发工作。 常用设置 自动导入包 在Java代码中,我们经常需要…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部