本题共有两个解题思路:迭代思想 和 递归思想。
思路一:(迭代思想)
迭代链表就是将链表的节点一个一个的遍历。对于链表,我们可以将每个节点结构进行修改,由原来的节点(值+下一节点的指针)变成(值+上一节点的指针),这就是利用迭代思想把节点一个一个的修改。其中要注意的是,当我们正常迭代节点时,我们是不能直接获取前一个节点的,所以我们需要设置一个变量prev来保存前一个的节点。同时还有设置变量next保存下一个节点,因为当我们修改节点结构后,我们只能找前一个节点了,而不能正常遍历下一个节点!

代码如下:

 //迭代算法
  public ListNode iterator(ListNode head){
    //prev保存前一个结点,但最开始为null。next保存下一个节点
    ListNode prev=null,next;

    //curr指针用来遍历链表,不能用head,因为head节点被修改后是找不到下一个结点的.   
    ListNode curr=head;

    while(curr!=null){
      next=curr.next;//修改节点结构前,先保存下一节点
      curr.next=prev;//就该节点结构,将下一节点的指针指向前一个节点。
      prev=curr;//修改完节点结构后,让当前节点成为前一个节点
      curr=next;//继续迭代下一个节点。
    }
    return prev;//返回链表的最后一个节点作为链表头。
  }

思路二:(递归思想)
递归思想,就是将一件很复杂的操作拆分成很多层的子操作(这里就涉及到看题目符不符合递归思想)。这里的递归思想,就是将整个链表反转的操作拆分成每两个节点反转的子操作!(这里递归节点的操作原理 很像 遍历链表节点,但是递归的思想是避免重复的工作,让它自己完成自己,跟遍历不同,遍历是一个一个的重复工作,很容易冗余代码)。

代码如下:

 //递归算法
  public ListNode recursion(ListNode head){
    if(head==null ||head.next==null){//先设置递归终点条件
      return head;//当递归到最后一个节点,直接返回做后一个节点作为结果
    }
    ListNode new_head = recursion(head.next);//这里进行递归,将结果保存起来

    //下面进行反转两个节点的操作
    head.next.next=head;//后一个节点指向前一个节点
    head.next=null;//断开前一个结点指向后一个节点的指针
    //这里就完成两个链表之间的反转操作

    return new_head;//返回递归终点传过来的链表尾节点
  }