题目
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
思路
- 双指针:创建指针p,curr,初始分别指向null和头节点,每轮循环移动一个节点的指向,直到指到最后一个位置为止。

 - 递归法:基于双指针。注意递归的退出条件
 
实现
- 双指针
 
class Solution {
    public ListNode reverseList(ListNode head) {
             
        ListNode p = null;
        ListNode curr = head;
    //注意这里退出循环得条件,因为curr是在指针翻转之后才赋
    //值,所以最后当curr为null得时候其实已经全部翻转完成了
        while(curr != null){
            ListNode temp = curr.next;
            curr.next = p;
            p = curr;
            curr = temp;
        }
    return p;  
    }
}
 
- 递归法
 
class Solution {
    public ListNode reverseList(ListNode head) {
            
      ListNode pre = null;
      ListNode curr = head;      
      return  reverse(pre,curr);
         
    }
    public ListNode reverse(ListNode pre,ListNode curr){
          
          //递归退出条件
          if(curr == null) {
              return pre;
          } else{
             ListNode temp = curr.next;
             curr.next = pre;
             //注意这里也需要return的
             return  reverse(curr,temp); 
          }
          
        
    }
}
                


















