牛客链表题:BM1 反转链表(取头放尾法)

描述

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 0≤𝑛≤10000≤n≤1000

要求:空间复杂度 𝑂(1)O(1) ,时间复杂度 𝑂(𝑛)O(n) 。

如当输入链表{1,2,3}时,

经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

以上转换过程如下图所示:

示例1

输入:

复制代码
{1,2,3}

复制返回值:

复制代码
{3,2,1}

复制

示例2

输入:

复制代码
{}

返回值:

复制代码
{}

说明:

复制代码
空链表则输出空                 

思路:

由于指针链表只能在元素后面连接新链表,而不能直接在第一个位置上加元素,因此先排尾巴。每次将排好的尾巴连接在未排序列第一个位置后取出,从而增加一个排好的元素。

取头放尾法:将链表反转的方法,创建三个变量,一个放未取的尾,一个放排好的尾,一个取头放尾(未排的尾)、加头放尾(排好的尾)。

创建指针:

cur:将排好的尾巴pre加在未排的第一个元素后、从tmp取还未排的元素

tmp:存放还未排的元素

pre:存放排好了的尾巴

  1. 将当前链表的第二位地址赋值给tmp:tmp = cur->next(即:tmp取链表第二位开始到结尾)

  2. 将当前链表第一位连接到pre(初始为nullptr,后续为排列好的尾巴)上:cur->next=pre(即:加上排列好的尾巴,排好的元素+1)

  3. 将cur赋值给pre:pre=cur(即:将排好元素+1的结果放入pre这个专门存放排好尾巴的变量)

  4. 取出tmp值给cur:cur=tmp(即:将还未排的,后面的,给cur参与下一次排),如果cur为空了,即没有还未排的了,退出循环,返回排好的pre。

代码:

cpp 复制代码
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* ReverseList(ListNode* head) {
        // write code here
        if(head == nullptr)
        return nullptr;
        ListNode  *cur = head, *tmp = nullptr, *pre = nullptr;
        while (cur!=nullptr)
        {
            tmp = cur->next;//放尾
            cur->next = pre;//取头,加头
            pre = cur;//存排好的尾
            cur = tmp;//取放好的尾
        } 
        return pre;
    }
};
相关推荐
2501_933329554 小时前
媒介宣发技术实践:Infoseek舆情系统的AI中台架构与应用解析
开发语言·人工智能·架构·数据库开发
[J] 一坚4 小时前
嵌入式高手C
c语言·开发语言·stm32·单片机·mcu·51单片机·iot
odoo中国4 小时前
Odoo 19技术教程 : 如何在 Odoo 19 中创建 Many2one 组件
开发语言·odoo·odoo19·odoo技术·many2one
借雨醉东风5 小时前
程序分享--常见算法/编程面试题:旋转矩阵
c++·线性代数·算法·面试·职场和发展·矩阵
逻辑驱动的ken5 小时前
Java高频面试考点场景题14
java·开发语言·深度学习·面试·职场和发展·求职招聘·春招
云泽8086 小时前
笔试算法 - 双指针篇(二):四大经典求和题型 + 有效三角形计数问题
c++·算法
techdashen6 小时前
Cloudflare 如何把一个大型代理拆成三个小服务来提升可靠性
开发语言·rust
geovindu6 小时前
go: Chain of Responsibility Pattern
开发语言·设计模式·golang·责任链模式
十五年专注C++开发7 小时前
WaitingSpinnerWidget: 一个高度可配置的自定义Qt等待加载动画组件
开发语言·c++·qt·waitingspinner
qeen877 小时前
【数据结构】树的基本概念及存储
c语言·数据结构·c++·学习·