牛客题霸NC78反转链表Java题解
https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=117&&tqId=35000&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

方法1:双指针
解题思路:当链表为空head==null 或长度为1时,直接返回head。定义pre和cur两个节点分别指向null和head节点。然后开始从head节点依次修改指针。先利用tmp节点暂存当前节点的下一个节点,再将当前节点指向它的前一个节点pre,然后再将pre节点和当前节点cur往后移一位,再修改下一个节点的指针。

public class Solution {
    public ListNode ReverseList(ListNode head) {
         if(head==null || head.next==null){  //判断链表为空或长度为1的情况
             return head;
         }  

        ListNode pre = null; 
        ListNode cur = head;
        ListNode tmp = null; //记录当前节点的下个节点


        while(cur!=null){
            tmp = cur.next;  //记录当前节点的下一个节点 
            cur.next = pre;  //让当前节点的next指向前一个节点
            pre = cur;       //pre往前移动一位
            cur = tmp;       //当前节点往后移动一位 
        }
        return pre;
    }
}

方法2:递归
解题思路:利用递归,从后往前返回,倒序依次修改指针,完成链表反转

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        return reverse(head,null);
    }
    private ListNode reverse(ListNode cur,ListNode pre){
        if(cur == null){  //当前节点为null时,返回
            return pre;
        }
        ListNode node = reverse(cur.next,cur);  //递归下一个节点
        cur.next = pre;    //当前节点指向前一个节点
        return node;
    }
}