利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

一、反转整个链表

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

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
//单链表的实现结构
public class ListNode {
  int val;
  ListNode next;
  ListNode(int x) { val = x;}
}

反转链表利用迭代不难实现,如果使用递归则有些许难度。

首先来看源码实现:

ListNode reverse(ListNode head) {
  if(head == null || head.next == null)
    return head;
  ListNode ret = reverse(head.next);
  head.next.next = head;
  head.next = null;
  return ret;
}

是否看起来不知所云,而又被这如此简洁的代码所震撼?让我们一起探索一下其中的奥秘。

对于递归算法,最重要的是明确递归函数的定义。

我们的 reverse函数的定义如下:

输入一个节点 head,将以 head 为起点的链表反转,并返回反转之后的头节点。

利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

明白了函数的定义后,在来看这个问题。比如我们想反转这个链表

利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

那么输入 reverse(head)后,会在 ListNode ret = reverse(head.next);进行递归

不要跳进递归!(你的脑袋能压几个栈呀?)

根据 reverse函数的定义,函数调用后会返回反转之后的头节点,我们用变量 ret接收

利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转现在再来看一下代码

head.next.next = head;

利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

接下来:

head.next = null;
return ret;

利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

再跳出这层递归就会得到:

利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

神不神奇,这样整个链表就反转过来了!

递归代码就是这么简洁优雅,但要注意两个问题:

1、递归函数要有base case,不然就会一直递归,导致栈溢出

if (head == null || head.next == null) return head;

即链表为空或只有一个节点,直接返回

2、当链表递归反转后,新的头节点为 ret,而 head变成了最后一个节点,应该令链表的某尾指向 null

head.next = null;

理解这两个问题之后,我们可以进一步深入研究链表反转的问题,接下来的问题其实均为在这个算法上的扩展。

二、反转链表前N个节点

接下来我们来看这个问题:

问题:反转链表前N个节点,并返回链表头节点

说明:1

Original: https://www.cnblogs.com/Code-CHAN/p/13620048.html
Author: Code-CHAN
Title: 利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584185/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022牛客暑期多校训练营3-A.Ancestor(LCA)

    题目传送门:https://ac.nowcoder.com/acm/contest/33188/A 题意: • 给出两棵编号 1-n 的树 A B , A B 树上每个节点均有一个…

    数据结构和算法 2023年6月8日
    0111
  • xctf-streamgame1

    下载附件后,得到两个文件,一个key文件,一个streamgame1.py文件 key文件如下:(十六进制形式) 55 38 F7 42 C1 0D B2 C7 ED E0 24 …

    数据结构和算法 2023年6月7日
    097
  • LeetCode 1438. 绝对差不超过限制的最长连续子数组

    题目链接 1438. 绝对差不超过限制的最长连续子数组 注意事项 multiset中取最大值:rebeginmultiset中取最小值:begin 代码 class Solutio…

    数据结构和算法 2023年6月8日
    090
  • [开源]C++实现控制台随机迷宫

    我全程使用TCHAR系列函数,亲测可以不改动代码兼容Unicode/ANSI开发环境,功能正常。大概有100行代码是来自网络的,我也做了改动,侵权请联系删除。本文作者szx0427…

    数据结构和算法 2023年6月7日
    097
  • 线索二叉树的构造及前驱后继的查找

    在本文中,我将介绍三种线索二叉树的构造方法,包括中序线索二叉树、先序线索二叉树以及后序线索二叉树。在介绍过程中,首先我会给出构造的基本思路,然后说明其中几点注意事项,最后我将给出代…

    数据结构和算法 2023年6月12日
    090
  • [游记]CSP 2021 J/S

    这一次,也许是我的OI生涯的 转折点了…… 能过,学习OI的时间就不会减少;但 不能过,就会减少学习OI的时间…… 上午(S组) 6…

    数据结构和算法 2023年6月8日
    082
  • 数字三角形

    数字三角形 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。(下面…

    数据结构和算法 2023年6月7日
    077
  • 树链剖分详解&题解 P6098 【[USACO19FEB]Cow Land G】

    看到各位大佬们已经把其他的东西讲的很明白了,我这个 juruo 就讲一讲最基本的树链剖分吧。 0.树剖是什么?能吃吗? 不能吃 树剖是树链剖分的简称,我们一般说的树剖其实指 重链剖…

    数据结构和算法 2023年6月12日
    067
  • DFS全排列

    dfs全排列 更新对全排列递归方法的理解 u是一个局部变量,它是用来指向每一条排列序列的元素的st是全局变量数组,它能保证每一条单独的线路不发生重复 如上图所示最初u是要从1到n(…

    数据结构和算法 2023年6月7日
    096
  • 二分查找(Java实现)

    有没有正在学数据结构的?没学过C,只会Java的我表示算法好难 ┭┮﹏┭┮。 废话不多说,分享一个很简单的二分查找,在有序数组(从小到大排序)中查找T类型的变量,我就直接用int …

    数据结构和算法 2023年6月7日
    091
  • 数据结构3.2栈的应用

    1 #define _CRT_SECURE_NO_WARNINGS 1 2 3 #include 4 #include 5 #include<string.h> 6 #…

    数据结构和算法 2023年6月16日
    080
  • P5903 【模板】树上 k 级祖先

    树链剖分LCA 主要在于,首先要找x的k级祖先,从这个点出发不断往上找他的顶端端点,如果顶端端点所在的深度小于k级祖先所在的深度(也就是dep[x] – k),继续找他…

    数据结构和算法 2023年6月8日
    091
  • 星空

    大概是因为近视或者污染严重的缘故,我已经很少能看到星空了。更多时候抬起头,望见的只是无法穿透的黑夜。但星空就在那里,它不会因为我看不见它而消失。准确地说,星空一直在我们每个人的心里…

    数据结构和算法 2023年6月12日
    081
  • 删除链表结点类问题

    删除链表结点 NO1. 删除链表倒数第 k个结点 给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针。要求:空间复杂度 (O(1)),时间复杂度 (O(n)) 如果倒数第…

    数据结构和算法 2023年6月8日
    092
  • 关于指针常量(编译器优化)

    牛客题目: 点击查看代码 const int a =10; int *p=(int*)(&a); *p=20; cout<<"a="<…

    数据结构和算法 2023年6月7日
    074
  • 统一建模语言UML—类图

    什么是统一建模语言,来看看百科中的介绍统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,…

    数据结构和算法 2023年6月8日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球