本题是关于链表的翻转问题,要求将单链表翻转并返回新的头结点。有下面两种解法。
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; }