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时就结束了。