206.反转链表
题目
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例
示例1
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例2
输入:head = [1,2]
输出:[2,1]
示例3
输入:head = []
输出:[]
提示
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
**进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
解答
- 递归的终止条件是当前节点或者下一个节点==null
- 在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句
- 返回新的节点
使用递归解答(Java)
/*** 定义节点类*/
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ListNode {int val;ListNode next;
}class Solution {/*** 反转链表* @param head 头节点* @return 反转后的头节点*/public ListNode reverseList(ListNode head) {// 使用递归(如果节点为空 那么返回null)if(head.next == null){return head;}// 创建新的节点(依次往下进行寻找 找到最后一个节点)ListNode newLinkedNode = reverseList(head.next);// 将最后一个节点的next指向当前节点head.next.next = head;// 将当前节点的next指向nullhead.next = null;// 返回新的节点return newLinkedNode;}@Test@DisplayName("测试-反转链表")public void test(){ListNode head = new ListNode(1,new ListNode(2,new ListNode(3,new ListNode(4,new ListNode(5,null)))));ListNode result = reverseList(head);System.out.println("result.toString() = " + result.toString());}
}