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指向null
head.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());
}
}