标签:head ListNode 递归函数 next 链表 LeetCode206 curr 节点 解法
本题是关于链表的翻转问题,要求将单链表翻转并返回新的头结点。有下面两种解法。
1.解法一:单纯的通过迭代更换节点指针,不断向后迭代。代码如下:
public ListNode reverseList(ListNode head) { ListNode pre=null; ListNode curr=head; while(curr!=null){ ListNode nex=curr.next; //记录后一个节点放置丢失 curr.next=pre; pre=curr; curr=nex; } return pre; }
2.解法二:递归实现。由于递归的方法适合于大量重复的操作过程,链表倒置恰好也是重复实现更换指针的操作,所以适合使用递归。
-思路: 2.1 首先需要明确递归函数的功能是什么,本题的递归函数的功能是将当前节点与其后继节点的指针倒置,即让后继节点指向当前节点。
2.2 之后考虑递归出口,显然当当前节点为空或者当前节点的后继节点为空时,已经不需要再倒置了,直接返回该节点即可。
2.3 写具体的递归函数体时,先不要往后看,只考虑当前节点需要做什么,显然根据2.1中递归函数功能,这里应该实现倒置指针的功能,即只需要 head.next.next=head即可,而且由于更换了指针,head的指针失效了,这里需要更新head的指针,显然应该更新为null。
2.4 到了最复杂的一步了,就是递归函数怎么包含在递归体中,可以先考虑递归函数的最终返回目标是什么,由于最终返回最后的节点,这里应该是返回最后一次递归函数的返回值,
由于递归函数是不断向下运行一直到中断的,reverse(head.next)最终返回的肯定是最终的节点,而且为了不丢失节点,显然该部应该在head.next.next=head的前一步进行,所以是先 写递归函数,在写函数体。
2.5 最终返回上一步得到的最后一个节点即可。代码如下:
public ListNode reverseList(ListNode head) { if(head==null||head.next==null) return head; ListNode nex=reverseList(head.next); head.next.next=head; head.next=null; return nex; }
标签:head,ListNode,递归函数,next,链表,LeetCode206,curr,节点,解法 来源: https://www.cnblogs.com/lzjdsg/p/14692235.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。