一、链表反转 例如,给定一个单链表,原链表中的数据为: 1–>2–>3–>,反转后的链表为:4–>3–>2–>1。 二、递归思想 递归,有”递“还要有”归“,所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,否则会一直调用自己,造成死循环,从而栈内存溢出。也就是说,我们需要...
一句话总结:每次递归返回原链表[当前节点至链表尾]的局部反转链表的表头! 如下图,原链表的4、5节点已经被反转完成,当前节点为head=3,继续添加3节点至反转链表中,就是使反转链表表头head.next=4的next节点为head=3即可,也就是head.next.next = head,注意:必须保证原链表表头在反转链表中的next为null! [注意]:...
链表的反转关键就是让指针域进行变更, 初始状态:结点Null→A→B→C→Null 需要调整为:结点Null←A←B←C←Null. 因为最开始是从A开始,所以需要先定义一个链表类型的节点 prev,用于存储当前节点的前置节点。 再定义一个链表类型的节点next,用来临时存储当前节点的下一个节点。 最后return prev结点,因为结点之间有...
由于递归返回此时head结点是二号结点。 执行head->next->next=head代码后,因为head->next指针是二号结点,二号结点的next指针指向了head。 然后head->next=NULL。然后链表反转成功返回newHead,将尾结点作为新的头结点。 2.分析多个结点情况如此,递归函数先递归进行到最后一个结点,然后逐层递归返回。并修改指向的指针...
leetcode 206反转链表: 迭代法的核心: 需要使用一个辅助节点, 用来方便进行指针的方向转换 代码如下: 递归法的核心: 主要理解递归函数的核心意义所在, 将复杂问题抽象成简单的情况, 比如当前的反转问题 我们把当前函数reverse 定义为 反转以head节点为头节点的整个链表 ...
1、递归函数要有 base case,也就是这句: if (head.next == null) return head; 意思是如果链表只有一个节点的时候反转也是它自己,直接返回即可。 2、当链表递归反转之后,新的头结点是last,而之前的head变成了最后一个节点,别忘了链表的末尾要指向 null: ...
4 反转部分链表 classSolution{publicListNodereverseBetween(ListNodehead,intleft,intright){if(head==null||head.next==null)returnhead;//相对的,其实如果把left看作第一个节点,就等于反转前n个节点,所以此处使用递归。if(left==1){returnreverseN(head,right);}head.next=reverseBetween(head.next,left-1,ri...
反转链表算法很经典了,我们面试也经常会遇到。 大致的话会分为两种解法:一种是迭代 一种是递归 一、迭代法 publicListNodereverseList(ListNodehead){ListNodepre=null,cur=head,tmp=null;while(cur!=null){//存储下一个节点地址tmp=cur.next;//把当前节点指向上个节点cur.next=pre;//两个节点分别往前挪//上...
最简单的情况是,当链表只有一个节点或为空时,反转后的链表应该是它本身。递归的边界条件就是:链表为空或只有一个节点时;直接返回链表。然后递归得核心操作是:将链表得头节点与后面得节点反转。具体来说,递归函数会通过调用自己,把头节点后面的部分链表反转,然后将当前节点连接到反转后的链表尾部。这样一来;每一层...
publicListNode reverseList(ListNode head) {//终止条件if(head ==null|| head.next ==null)returnhead;//保存当前节点的下一个结点ListNode next = head.next;//从当前节点的下一个结点开始递归调用ListNode reverse = reverseList(next);//reverse是反转之后的链表,因为函数reverseList// 表示的是对链表的反转...