题目
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
题解一(迭代)
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
分析
在遍历链表时,将当前节点的 next\textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。先考虑使用三个指针,过程图解:
其中,第三个指针(蓝色的)不必用单独的变量来记录,只需在每次指针反转前暂存一下即可。
注意两指针 prev、curr 初始值分别为 null、head.
题解二(递归)
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
分析
注意:第一次返回时,newHead 指向链表倒数第二个元素(区分好形参与实参)。