仍以图 1 中的链表为例,则整个递归实现反转的过程如下:1) 由于 head 不为 NULL,因此函数每执行到第 11 行时,递归都会深入一层,并依次将指向节点 2、3、4 的指针作为实参(head_next 的指向)参与递归。而根据递归出口的判断条件,当函数参数 head 指向的是节点 4 时满足 head->next == NULL,递归过...
最后一步: 2、递归方式 我们再来看看递归实现链表翻转的实现,前面非递归方式是从前面数1开始往后依次处理,而递归方式则恰恰相反,它先循环找到最后面指向的数5,然后从5开始处理依次翻转整个链表。 首先指针H迭代到底如下图所示,并且设置一个新的指针作为翻转后的链表的头。由于整个链表翻转之后的头就是最后一个数,所...
//利用递归反转单链表 public ListNode reverse(ListNode head){ //判断边界情况 if(head == null || head.next == null) return head; ListNode temp = head.next;//定义链表结点temp暂存当前节点(也就是第一个结点)的指针域。 ListNode newHead = reverse(head.next); //对链表进行递归反转。递归就体现...
这里又涉及到 head 和reverseN(head.next, n - 1)指针关系的处理,和递归反转单链表是类似的,第一步是让 2 号节点指向 1 号节点,第二步略有不同,反转单链表是直接让1号节点指向 null,而这里应该让 1 号节点指向 4 号节点,也就是不需要反转的部分。因此,就需要一个指针记录 4 号节点的位置。 reverseN...
newHead =self.reverseList(head.next)# 递归:self.reversetList 是反转链表,newHead 是原链表的尾结点,也是新链表的第一个结点head.next.next= head# 当前结点的原下一个结点的 next 指针转向,指向当前节点:head 在递归中就是当前结点,此时 head.next 没有变,是原链表中 head 的下一个结点head.next= None...
反转链表的递归过程可以拆分为若干步骤。以下是整个流程的表格形式: 二、具体代码实现 接下来,我将逐步引导你实现反转链表的代码。 1. 定义链表节点类ListNode 首先,我们需要定义一个表示链表节点的类。 // 定义链表节点类classListNode{intval;// 节点的值ListNodenext;// 指向下一个节点的引用// 节点的构造函数Li...
这个也正是递归的一个精髓所在,同时也是一个递归笑话的来源:当你理解了递归,你也就理解了递归。 那我们继续往下看。4、执行函数 reverseList(4) 此时,入参值 head 为 4 了,由于 head 不为空并且 head.next 为 5 这个结点也不为空,因此 if 这个语句的判定条件都是 false,不会执行里面的 return 语句。
先看递归的升级版本 leetcode: 92反转链表 解题思路仍然是要拆分子问题, 首先明确主函数的定义: 给定head 反转其中 left 到 right的节点, 其他节点不动 我们可以很容易想到 当left = 1时, 就相当于反转前right个节点 那么我们可以首先定义一个函数 reverse(ListNode head, int n) 用来反转head为节点的头结点的...
reverseN 递归反转链表的算法,具体的思路如下: 函数reverseN 用于反转以 head 为起点的前 n 个节点,并返回反转后的新头结点。 当n 等于 1 时,表示只有一个节点需要反转,那么记录下第 n + 1 个节点(后驱节点 successor),并返回当前节点 head。