C++实现LeetCode(143.链表重排序)

yizhihongxing

对于C++实现LeetCode题目,一般需要注意以下几个方面:

1.理解题目,找出其中的规律和特点。
2.选择适当的数据结构和算法,实现解题思路。
3.编写代码实现解题思路。
4.提交代码并检查题目结果。

下面我们来详细讲解如何用C++实现LeetCode(143.链表重排序)的完整攻略。首先,我们可以查看题目描述:

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:

L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

从题目描述中可以看出,要求我们重新排列链表,将链表的头节点与尾节点相连接,依次从头结点和尾节点中取出节点,依次排列,直到中间节点为止。 因此,我们需要将链表分为两个部分,一部分是头节点和中间节点之前的节点,另一部分是中间节点和尾节点之间的节点,将这两个部分分别转化为顺序表,然后依次组合就可以得到最终结果。

接下来,我们可以来看看实现过程:

1.读入链表,并将节点存入数组中。

class Solution {
public:
    void reorderList(ListNode* head) {
        if (!head || !head->next) return;
        ListNode* cur = head;
        vector<ListNode*> vec;  // 存储所有节点
        while (cur) {
            vec.emplace_back(cur);
            cur = cur->next;
        }
        int n = vec.size();

2.将链表分为两个顺序表,并翻转后一个顺序表。

        for (int i = 0; i < n / 2; ++i) {
            vec[i]->next = vec[n - i - 1];
            vec[n - i - 1]->next = vec[i + 1];
        }
        vec[n / 2]->next = nullptr;
        ListNode* tail = vec[n / 2 + 1];
        reverse(vec.begin() + n / 2 + 1, vec.end());

3.将两个顺序表依次合并。

        cur = head;
        for (int i = 0; i < n; ++i) {
            ListNode* t = vec[i];
            if (cur == tail) break;
            t->next = cur->next;
            cur->next = t;
            cur = t->next;
        }
    }
};

接下来,我们来看一下示例:

示例1:

输入:1->2->3->4
输出:1->4->2->3

示例2:

输入:1->2->3->4->5
输出:1->5->2->4->3

对于示例1,我们将链表分为{1,2}和{4,3},然后倒置后一个顺序表得到{4,3},最后合并{1,4,2,3},得到最终结果。

对于示例2,我们将链表分为{1,2,3}和{5,4},然后倒置后一个顺序表得到{5,4},最后合并{1,5,2,4,3},得到最终结果。

最后,我们通过提交代码和检查题目结果来验证代码的正确性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(143.链表重排序) - Python技术站

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

相关文章

  • Swing常用组件之单选按钮和复选框

    作为一个Java Swing网站的作者,我非常愿意为大家分享Swing常用组件之单选按钮和复选框的攻略。 什么是单选按钮和复选框? 单选按钮和复选框都是Swing中常用的按钮类型。它们都继承自JToggleButton类,支持选中和非选中两种状态,并且可以通过setSelected()方法来进行设置。区别在于单选按钮只能够选中一个,而复选框则可以选中多个。 …

    other 2023年6月26日
    00
  • 查看tomcat的版本号

    查看Tomcat的版本号 Tomcat是一款常用的Java Web应用服务器,其版本号常常需要我们在使用中进行查看。本文将介绍如何通过Tomcat的管理界面和命令行两种方式来查看Tomcat的版本号。 通过管理界面查看Tomcat版本号 打开Tomcat的管理界面,在浏览器地址栏中输入http://localhost:8080/manager并回车,如果提示…

    其他 2023年3月28日
    00
  • 什么是数据结构?

    数据结构是计算机科学中的一种非常重要的概念,它描述了数据的组织方式和处理方法,是解决各种复杂问题的必要基础。本文将介绍数据结构完整攻略的流程和相关概念。 数据结构的基本概念 数据结构的基本概念包括数据、数据元素、数据对象、数据类型和数据结构。 数据: 数据是描述某种事物的符号,是计算机程序处理的对象; 数据元素: 组成数据的基本单位,是数据结构中的基本对象;…

    其他 2023年4月19日
    00
  • 苹果iOS 13.3/iPadOS 13.3开发者预览版Beta2推送 iOS13.3 beta2更新内容汇总

    苹果iOS 13.3/iPadOS 13.3开发者预览版Beta2推送 iOS13.3 beta2更新内容汇总 简介 本次推送的是苹果iOS 13.3/iPadOS 13.3开发者预览版Beta2,是一次针对开发者的测试版本。本文将对iOS13.3 beta2的更新内容和使用方法进行详细的介绍。 更新内容 修复了iCloud Backup的问题 在iOS 1…

    other 2023年6月26日
    00
  • SpringBoot 插件化开发模式详细总结

    SpringBoot 插件化开发模式详细总结 1. 什么是插件化开发模式 插件化开发模式是一种将应用程序的功能模块化的开发方式。在SpringBoot中,插件化开发模式允许将应用程序的特定功能封装为插件,然后通过添加或删除插件,动态改变应用程序的功能。 2. 插件化开发模式的优势 可扩展性:通过插件化开发模式,应用程序可以轻松地扩展、添加或删除功能,而不必修…

    other 2023年6月28日
    00
  • Android 不一样的原生分享

    Android 不一样的原生分享的完整攻略 在Android中,原生分享功能是一个非常常用的功能,可以让用户将内容分享到其他应用程序中。本文将详细讲解Android不一样的原生分享的完整攻略,包括如何使用Intent实现原生分享功能,以及如何自定义分享内容和分享界面。 使用Intent实现原生分享功能 在Android中,可以使用Intent实现原生分享功能…

    other 2023年5月5日
    00
  • Android学习小结之Activity保存和恢复状态

    在Android中,可以通过保存和恢复状态来确保在Activity生命周期发生变化时保留数据和用户界面的状态。以下是一个完整的攻略,用于学习如何在Activity中保存和恢复状态: 保存状态: 在Activity中,重写onSaveInstanceState方法。在该方法中,使用Bundle对象保存需要保留的数据。 java @Override protec…

    other 2023年9月5日
    00
  • fastDFS文件服务器迁移

    FastDFS文件服务器迁移 FastDFS是一个开源的分布式文件系统,具有高性能、高可靠性、易部署、易扩展等特点,被广泛应用于大规模文件存储场景。但是,在实际使用过程中,我们难免会遇到需要迁移FastDFS文件服务器的情况,本文将介绍FastDFS文件服务器迁移的相关操作和注意事项。 迁移前准备工作 在进行FastDFS文件服务器的迁移之前,我们需要进行以…

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