从反转链表看递归的用法-力扣-反转链表

递归,通常理解就是自己调用自己,但是在实际应用中,可能很多人想不到这个问题可以递归解决,调用自身说明了这个在大问题能够分解成小问题中,那么就可以使用。下面从力扣的反转链表来说明。

题目描述

来源:反转链表 [简单],请你反转链表,并返回反转后的链表。

输入:head = [1,2,3,4,5->null]
输出:[5,4,3,2,1->null]
解题思路-1

首先可以用遍历解决,这个是大部分同学能想到的,只需要借助几个辅助节点。主要思想是我们要将当前节点的下一个节点指向当前节点,也就是current.next = current, 这样做的话,current.next 后续的节点就找不到了,因此要事先存储后一个节点,也就是temp = current.next:

ListNode prev = null;
ListNode current = head;
while (current != null) {
    ListNode next = current.next;
    current.next = prev;
    prev = current;
    current = next;
}
return prev;
解题思路-2

如果我们想反转整个链表,只要将当前节点后面的链表反转完成,然后用后面的最后一个也就是当前的下一个指向当前即可,因此问题变成反转当前节点的后一个,直到反转最后一个:

public ListNode reverseList2(ListNode head) {
//        3、现在考虑结束条件 首先最后一个节点不需要反转,因为在之前已经反转过,其次输入条件可能为空 这种情况直接返回本身
	if (head == null || head.next == null) {
		return head;
	}

//        要将当前节点进行反转,只要知道后续的反转链表即可,然后把后续的最后一个 也就是当前的下一个指向当前 当前节点指向空即可
//        1、因此可以写下第一段代码 反转当前的,需要先把后续的反转了 后续反转的头节点就是第一个节点
	ListNode node = reverseList2(head.next);
//        2、现在第二段的代码,后续的已经反转的情况下,将后续的最后一个指向当前 当前的指向空
    head.next.next = head;
    head.next = null;

    return node;
}

你可能感兴趣的:(链表,leetcode,数据结构)