LeetCode-206. 反转链表-Java实现
实现效果
非递归实现
public ListNode reverseList(ListNode head) { if(head==null){ return null; }else if(head.next==null){ return head; } ListNode now = head; ListNode nextNextTemp = null; ListNode next = null; ListNode pre = null; do{ next = now.next; if(next==null){ now.next = pre; pre = now; break; } nextNextTemp = next.next; next.next = now; now.next = pre; pre = next; now = nextNextTemp; }while(now!=null); return pre; }
递归实现
public ListNode reverseList(ListNode head) { if(head==null){ return null; }else if(head.next==null){ return head; }else{ ListNode next = head.next; ListNode result = null; if(next.next==null){ next.next = head; head.next = null; result = next; }else{ result = reverseList(next); next.next = head; head.next = null; } return result; } }
过程
递归实现
实现起来先实现的是递归方法,其实就是把任务分解成一个循环重复的步骤,我习惯是从出口考虑的,也就是最后一层的递归,也就是将最后一个节点的next指针指向前一个(也就是这一层递归的head),然后返回最后一个节点的引用(指针),然后前面的迭代就是把之前引用的本层的next节点的next(也就是next.next)指向本层的head,因为next节点是下一轮返回来的ListNode的最后一个节点,所以应该指向head,倒回去后,在第一层返回这个节点就可以了,记得要把head.next设为空,要不然就死循环了。
非递归实现
非递归实现在时间上更快,因为其少了方法的嵌套(也就是少了方法的出栈入栈操作),具体而言就是一个循环,每一次的循环就是把链表截断成两部分,一部分是反向后的,一部分是未反向,每一次循环就是从未反向的链表中拿出一个来放到反向后的末尾,知道最后发现节点为NULL时就结束了。
下一篇:
【设计模式】23种设计模式简介