当前位置: 首页 > news >正文

数据结构-反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头节点。

分析:确保输入的链表头指针为NULL或者整个链表就一个节点的情况

/*
剑指offer面试题16
*/
#include <iostream>
#include <stack>

using namespace std;

struct ListNode{
    ListNode* Next;
    int data;
};

/*
自己的写的代码就是难看!
*/
ListNode* ReverseList(ListNode** head){
    if(*head == NULL){
        return NULL;
    }
    if((*head)->Next == NULL){  //当只有一个节点的时候,容易忽略
        return *head;
    }
    ListNode* p = *head;
    stack<ListNode*> s;

    while(p != NULL){
        s.push(p);
        p = p->Next;
    }

    ListNode* q = new ListNode;
    q = s.top();
    s.pop();
    ListNode* k = new ListNode;
    k = s.top();
    s.pop();
    q->Next = k;
    while(!s.empty()){
        k->Next = s.top();
        k = k->Next;
        s.pop();
    }
    k->Next = NULL;
    return q;
}

/*
代码简洁的思路是一个一个断裂,然后组合。
*/
ListNode* ReverseList1(ListNode** head){
    ListNode* pReHead = NULL;
    ListNode* p = *head;
    ListNode* pPrev = NULL;

    while(p != NULL){
        ListNode* pNext = p->Next;

        if(pNext == NULL){
            pReHead = p;
        }

        p->Next = pPrev;
        pPrev = p;
        p = pNext;
    }
    return pReHead;
}


int main()
{
    ListNode* head = new ListNode;
    ListNode* One = new ListNode;
    ListNode* Two = new ListNode;
    ListNode* tail = new ListNode;

    head->data = 0;
    head->Next = One;
    One->data = 1;
    One->Next = Two;
    Two->data = 2;
    Two->Next = tail;
    tail->data = 3;
    tail->Next = NULL;

    //ListNode* result = ReverseList(&head);

    ListNode* result1 = ReverseList1(&head);

    while(result1 != NULL){
        cout << result1->data << " ";
        result1 = result1->Next;
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/wn19910213/p/3723640.html

相关文章:

  • lua中rawget和rawset
  • Linux红黑树(二)——访问节点
  • lua中继承
  • SPOJ REPEATS Repeats (后缀数组:子串的最大循环节)题解
  • lua在什么时候设置元表失败呢
  • lua中通过__index继承父类的属性
  • C++中匿名函数的捕获列表和匿名函数的说明
  • lua中通过__index继承父类的方法
  • lua中函数闭包
  • Entity Framework加载相关实体——Lazy Loading
  • C++函数对象包装器std::function
  • cygwin 安装
  • shell 1
  • C#中FileStream——循环RingBuffer
  • 二分查找算法(折半查找算法)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • CentOS从零开始部署Nodejs项目
  • Debian下无root权限使用Python访问Oracle
  • HomeBrew常规使用教程
  • JavaScript异步流程控制的前世今生
  • js正则,这点儿就够用了
  • passportjs 源码分析
  • Phpstorm怎样批量删除空行?
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 工作中总结前端开发流程--vue项目
  • 利用jquery编写加法运算验证码
  • 原生 js 实现移动端 Touch 滑动反弹
  • 责任链模式的两种实现
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • ###C语言程序设计-----C语言学习(3)#
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (12)Hive调优——count distinct去重优化
  • (4)事件处理——(7)简单事件(Simple events)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十一)手动添加用户和文件的特殊权限
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)Google的Objective-C编码规范
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • :如何用SQL脚本保存存储过程返回的结果集
  • @EnableAsync和@Async开始异步任务支持
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Android]Android开发入门之HelloWorld
  • [Android]一个简单使用Handler做Timer的例子
  • [C++]打开新世界的大门之C++入门