好像几乎所有人都是递归解法,没有迭代解法,我就来说说迭代解法的思路:
如果一个节点是头结点 head ,后面连着一串节点,如何让该节点的指向反转呢?

head.next.next = head;
head.next = null;

这是针对于每个节点的反转操作,请画图理解一下。
如果对于每个节点都按照这样的解法操作,我们就能对每个节点进行节点的反转,迭代截止条件是 head == null 或者 head.next == null,为什么是这个条件呢?因为我们需要找到这个链表的最后一个节点,最后一个节点的下一个节点若为空,则说明已经找到了最后一个节点,直接返回作为头结点即可。当头结点都为空的时候,我们直接返回头结点即可,链表无需反转。

public class Solution {
    public ListNode ReverseList(ListNode head) {
        //递归版本
        if(head==null || head.next==null)
            return head;
        ListNode res = ReverseList(head.next);
        head.next.next = head;
        head.next = null;
        return res;
    }
}

再来一个递归版本的解法,比较容易理解

public class Solution {
    public ListNode ReverseList(ListNode head) {

        //迭代版本
        ListNode pre=null;
        ListNode cur=head;
        while(cur!=null){
            ListNode tmp=cur.next;
            cur.next = pre;
            pre = cur ;
            cur = tmp;
        }
        return pre;

    }
}