算法--(递归)---反转单链表

题目描述:
Reverse a singly linked list.

Example:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:

A linked list can be reversed either iteratively or recursively. Could you implement both?

采用递归的思路
思路:1.不要想递归每一步是怎样完成的,只需要关注递归的一级:每一级可以看做是下面这种情况

head---->head.next---->null,每一级都是这样的一个小子问题

2.递归终结的条件是什么:只有一个节点或者是没有节点了就递归结束

3.本级递归需要做的事情是什么:交换两个链表的指向:head.next-->null,head.next.next = head


下面就是具体的代码实现

package com.cxy.linkedtable;

/**
 * Reverse a singly linked list.
 *
 * Example:
 *
 * Input: 1->2->3->4->5->NULL
 * Output: 5->4->3->2->1->NULL
 * Follow up:
 *
 * A linked list can be reversed either iteratively or recursively. Could you implement both?
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/reverse-linked-list
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class ReverseSLList {

  public ListNode reverseList(ListNode head) {
    //采用递归调用的方式进行反转,不要在乎内部的细节,关注如下几点
    //    1.递归的终止条件:交换两个节点,如果只有一个节点或者是没有节点就可以停止了。
    //    2.本级递归需要给下级递归传递什么:给下级传递的就是当前结点的下一个节点
    //    3.本次递归做什么: 本次递归需要交换两个节点。
    if(head == null || head.next == null){
      return head;
    }
    //移动指针指向
    ListNode res = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return res;
  }

  public static void main(String[] args) {

    ReverseSLList slList = new ReverseSLList();
    ListNode l1 = new ListNode(1);
    l1.next = new ListNode(2);
    l1.next.next = new ListNode(3);
    ListNode node = slList.reverseList(l1);
    System.out.println(node.toString());
  }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(算法--(递归)---反转单链表)