206. 反转链表

问题描述

  1. 反转一个单链表。
  2. 示例:
  3. 输入: 1->2->3->4->5->NULL
  4. 输出: 5->4->3->2->1->NULL
  5. 进阶:
  6. 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

问题分析

开始我们定义一个虚拟的头结点a,他的下一个节点为head.假设我们到了某一步已经反转了一些元素:a->[], b->c->d->...,其中[]中是已经反转好的元素,b->c->d->...是待反转的元素,下一步我们要做的只是把b插到a与[]之间即可。先用c记录b的下一个结点(c=b->next),也是下一个待插的节点。令b->next指向a->next(b->next = a->next),令a->next指向b(a->next = b),注意顺序不可换,则b就插到a与[]之间了:a->b->[],c->d->...,然后把下一个待插元素c赋值给b,只要b不空,就继续插。

代码

  1. //迭代方法
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. * int val;
  6. * ListNode *next;
  7. * ListNode(int x) : val(x), next(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. ListNode* reverseList(ListNode* head) {
  13. ListNode* a = new ListNode(0);
  14. a->next = NULL;
  15. ListNode *b = head,*c;
  16. while(b != NULL)
  17. {
  18. c = b->next;
  19. b->next = a->next;
  20. a->next = b;
  21. b = c;
  22. }
  23. b = a->next;
  24. delete a;
  25. return b;
  26. }
  27. };

或者

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* reverseList(ListNode* head) {
  12. if(head == NULL) return NULL;
  13. ListNode* a = new ListNode(0);
  14. a->next = head;
  15. ListNode *b = head,*c=b->next;
  16. while(b->next != NULL)
  17. {
  18. c = b->next;
  19. b->next = c->next;
  20. c->next= a->next;
  21. a->next = c;
  22. }
  23. b = a->next;
  24. delete a;
  25. return b;
  26. }
  27. };

92. 反转链表 II

问题描述

  1. 反转从位置 m n 的链表。请使用一趟扫描完成反转。
  2. 说明:
  3. 1  m  n  链表长度。
  4. 示例:
  5. 输入: 1->2->3->4->5->NULL, m = 2, n = 4
  6. 输出: 1->4->3->2->5->NULL

问题分析

  1. 注意这道题第二部分的迭代和上一道题完全反转的迭代不同,上一道题相当于另外开了一个链表,然后一直往头结点和第二个节点之间添加元素。但是这道题在反转完成后还需要和后面不反转的连在一起,因此是相当于在原先链表上做。

代码

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* reverseBetween(ListNode* head, int m, int n) {
  12. ListNode *dummy = new ListNode(0);
  13. dummy->next = head;
  14. ListNode *a = dummy,*b,*c;
  15. int k = n-m;
  16. while(--m > 0)
  17. {
  18. a = a->next;
  19. }
  20. b = a->next;
  21. while(k-- >0)
  22. {
  23. c = b->next;
  24. b->next = c->next;
  25. c->next = a->next;
  26. a->next = c;
  27. }
  28. b = dummy->next;
  29. delete dummy;
  30. return b;
  31. }
  32. };

leetcode 206. 反转链表 及 92. 反转链表 II的更多相关文章

  1. LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)

    翻译 反转一个单链表. 原文 Reverse a singly linked list. 分析 我在草纸上以1,2,3,4为例.将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面精致 ...

  2. [LeetCode 206] Reverse Linked List 翻转单链表

    本题要求将给定的单链表翻转,是校招面试手撕代码环节的高频题,能很好地考察对单链表这一最简单数据结构的理解:可以使用迭代和递归两种方法对一个给定的单链表进行翻转,具体实现如下: class Soluti ...

  3. LeetCode 206. Reverse Linked List (倒转链表)

    Reverse a singly linked list. 题目标签:Linked List 题目给了我们一个链表,要求我们倒转链表. 利用递归,新设一个newHead = null,每一轮 把下一个 ...

  4. LeetCode 92. 反转链表 II(Reverse Linked List II)

    92. 反转链表 II 92. Reverse Linked List II 题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. LeetC ...

  5. LeetCode 206. 反转链表(Reverse Linked List) 16

    206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ...

  6. leetCode:206 反转链表

    206. 反转链表 题目:反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 非递归代码: class Solution { public ListNode reverseLis ...

  7. Leetcode 92.反转链表

    92.反转链表 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL ...

  8. Java实现 LeetCode 92 反转链表 II

    92. 反转链表 II 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-> ...

  9. LeetCode 92 ——反转链表 II

    1. 题目 2. 解答 我们需要先找到第 m 个结点及其上一个结点,然后将从 m 到 n 的结点进行反转,最后依次将 m 到 n 反转后的结点和 n 之后的结点放入原链表中即可. 从前往后依次遍历 m ...

随机推荐

  1. TMS570LS3137笔记-内部Flash FEE使用

    1.基本简介 TMS570LS3137内部Flash分为三个 Bank,主Flash 数据存储区3MB,是Bank1和Bank2.还有一个Bank7是作为内部Flash模拟EEPROM使用.内部存储器 ...

  2. Docker 快速删除无用(none)镜像

    Dockerfile 代码更新频繁,自然docker build构建同名镜像也频繁的很,产生了众多名为none的无用镜像. 分别执行以下三行可清除 docker ps -a | grep " ...

  3. 30个类手写Spring核心原理之动态数据源切换(8)

    本文节选自<Spring 5核心原理> 阅读本文之前,请先阅读以下内容: 30个类手写Spring核心原理之自定义ORM(上)(6) 30个类手写Spring核心原理之自定义ORM(下)( ...

  4. 贪心——122.买卖股票的最佳时机II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  5. 报错:cannot access com.google.protobuf.GeneratedMessageV3

    引入依赖 <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobu ...

  6. JAVA获取某年(当年)的第一天的开始时刻和某年(当年)的最后一天的最后时刻

    package com.date; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Dat ...

  7. 查找MySql的配置文件my.cnf所在路径

    Linux系统 linux 上可以使用 mysql --help|grep my.cnf 过滤查看 [root@localhost etc]# mysql --help|grep my.cnf ord ...

  8. 【LeetCode】1418. 点菜展示表 Display Table of Food Orders in a Restaurant

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计边的次数 日期 题目地址:https://le ...

  9. fastapi(一)

    废话不多说,直接上代码. 目录结构, 由于我也是刚开始学这个框架,只是了解了怎么注册蓝图,JWT的集成,数据库的集成,想了解更多,自行打开官方文档去详细阅读.fastapi官网文档链接 创建一个mai ...

  10. 编写Java程序,遍历所有英雄信息(美和易思JDBC,PreparedStatement执行查询语句练习习题)

    返回本章节 返回作业目录 需求说明: 继续完善英雄信息系统.使用JDBC技术,通过PreparedStatement对象的executeQuery()方法获取表示所有英雄数据的ResultSet结果集 ...