反转链表的两种方法
题目介绍
题目链接 206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
效果图如下所示
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
解法一:迭代方法
解题思路:
通过使用头插法和哑元节点的结合来达到翻转链表的目标。
public ListNode reverse(ListNode head){
if (head == null) {
return head;
}
// 哑元节点用于指向反转后的链表
ListNode newHead = new ListNode(0);
while (head != null) {
// 1.先把后一个节点缓存
ListNode nextNode = head.next;
// 2.使用头插法
head.next = newHead.next;
newHead.next = head;
// 3.继续遍历下一个链表节点
head = nextNode;
}
return newHead.next;
}
解法二:递归方法
解题思路:
使用递归方法,调用下一个节点,直到后面的节点已经被逆序,递归出口为当前节点为null,或者当前节点的下一个节点为null。
public ListNode reverse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverse(head.next);
head.next.next = head;
head.next = null;
return newHead;
}