这是一个很基础的题目。今天处理了一下,不论是以双指针迭代、递归等方法,都能处理,但是也使这个题目更为典型。

剑指 Offer 24. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)

https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-yi-dong-de-shuang-zhi-zhen-jia/790541

00 题目

提示:

  • 链表中节点的数目范围是 [0, 5000]

  • -5000 <= Node.val <= 5000

01 双指针(迭代)

01-0 思路

  1. 定义两个指针: cop 和 temp ;cop 在前 temp在后。

  2. 每次让 cop 的 next 指向 temp ,实现一次局部反转

  3. 局部反转完成之后, cop 和 temp 同时往前移动一个位置

  4. 循环上述过程,直至 cop 到达链表尾部

01-1 代码

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

02 递归

02-0 思路

总体思想是利用递归函数的函数栈来实现栈的特性。

  1. 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 ret.

  2. 此后,每次函数在返回的过程中,让当前结点的下一个结点的 next 指针指向当前节点。

  3. 同时让当前结点的 next 指针指向 NULL ,从而实现从链表尾部开始的局部反转

  4. 当递归函数全部出栈后,链表反转完成。

02-1 代码

 1 class Solution {
2 public:
3 ListNode* reverseList(ListNode* head) {
4 if (head == NULL || head->next == NULL) {
5 return head;
6 }
7 ListNode* ret = reverseList(head->next);
8 head->next->next = head;
9 head->next = NULL;
10 return ret;
11 }
12 };

03 强化双指针

03-0 思路

  1. 原链表的头结点就是反转之后链表的尾结点,使用 head标记 .

  2. 定义指针 cur,初始化为 head .

  3. 每次都让 head 下一个结点的 next 指向 cur ,实现一次局部反转

  4. 局部反转完成之后,cur 和 head 的 next 指针同时 往前移动一个位置

  5. 循环上述过程,直至 cur 到达链表的最后一个结点 .

03-1 代码

 1 class Solution {
2 public:
3 ListNode* reverseList(ListNode* head) {
4 if (head == NULL) { return NULL; }
5 ListNode* cur = head;
6 while (head->next != NULL) {
7 ListNode* t = head->next->next;
8 head->next->next = cur;
9 cur = head->next;
10 head->next = t;
11 }
12 return cur;
13 }
14 };

LeetCode->链表反转的更多相关文章

  1. [LeetCode] 链表反转相关题目

    暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...

  2. (leetcode)链表反转-c语言实现

    反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 使用迭代方法,代码 ...

  3. 链表反转&交换链表结点

    leetcode链表反转链接 要求摘要: 反转一个单链表 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-&g ...

  4. Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)

    Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...

  5. LeetCode 206——反转链表

    对单链表进行反转有迭代法和递归法两种. 1. 迭代法 迭代法从前往后遍历链表,定义三个指针分别指向相邻的三个结点,反转前两个结点,即让第二个结点指向第一个结点.然后依次往后移动指针,直到第二个结点为空 ...

  6. Leetcode 92.反转链表

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

  7. Java实现 LeetCode 206 反转链表

    206. 反转链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL ...

  8. 链表反转leetcode206

    最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...

  9. 链表反转 (Multi-method)

    链表反转是链表相关问题最基础的知识,做完LeetCode中LinkedList后才会有这种体会,因为ACM算法中不会涉及这一部分.解决这一问题有多种方法,在面试中面试官通常也会要求写出多种.包括sta ...

  10. java单链表反转

    今天做leetcode,遇到了单链表反转.研究了半天还搞的不是太懂,先做个笔记吧 参考:http://blog.csdn.net/guyuealian/article/details/51119499 ...

随机推荐

  1. The art of multipropcessor programming 读书笔记-硬件基础2

    本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...

  2. JVM堆内存泄露分析

      一.背景 公司有一个中间的系统A可以对接多个后端业务系统B,一个业务系统以一个Namespace代表, Namespace中包含多个FrameChannel(用holder保存),表示A连接到业务 ...

  3. Dapr + .NET Core实战(十三)跨语言开发

    因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...

  4. logstash输出到rabbitmq

    场景 将应用日志文件发送到rabbitmq. filebeat 不支持rabbitmq作为输出.因此,需要先将文件由filebeat发送到logstash ,再由logstash 输出到rabbitm ...

  5. 洛谷3973 TJOI2015线性代数(最小割+思维)

    感觉要做出来这个题,需要一定的线代芝士 首先,我们来观察这个柿子. 我们将\(B\)的权值看作是收益的话,\(C\)的权值就是花费. 根据矩阵乘法的原理,只有当\(a[i]和a[j]\)都为\(1\) ...

  6. Proxychains完成Linux命令行代理

    前言 Proxychains是一个Linux和类Unix平台非常流行的命令行代理工具,它支持强制应用的TCP 连接通过代理,支持 Tor.HTTP与 Socks 代理.与 sshuttle 不同的是, ...

  7. javascriptRemke之类的继承

    前言:es6之前在js中要实现继承,就必须要我们程序员在原型链上手动继承多对象的操作,但是结果往往存在漏洞,为解决这些问题,社区中出现了盗用构造函数.组合继承.原型式继承.寄生式继承等一系列继承方式, ...

  8. VS Code Remote SSH设置

    本文翻译自:5 Steps: Setup VS Code for Remote Development via SSH from Windows to Linux system 5个步骤:设置VS代码 ...

  9. Docker制作能够ssh连接的镜像

    本类文章只作为记录使用 命令操作: #拉取Centos 7 docker pull centos:7 #运行一个镜像 docker run -tdi --privileged centos:7 ini ...

  10. Python触发异常

    我们可以使用raise语句自己触发异常,raise语法格式如下: raise [Exception [, args [, traceback]]] 语句中 Exception 是异常的类型(例如,Na ...