206. 反转链表
206. 反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
-
迭代做法
首先定义三种指针,cur表示当前遍历的位置,prev表示cur的上一轮位置,nex指针用来提前存储好下一次的位置。显然,为了反转链表,需要cur指针每一轮更新,都要指向prev指针。提前存好cur的下一轮位置(即nex),是为了避免当前cur指针指向prev后,后续的位置丢失。迭代最后cur会变为空指针,返回prev。
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
ListNode* prev = nullptr;
while(cur){
ListNode* nex = cur -> next;
cur -> next = prev;
prev = cur;
cur = nex;
}
return prev;
}
- 递归做法
递归需要调用原函数本身,对于单向链表结构,显然只可能调用reverseList(head->next)。以下举一个例子:
比如当前输入是head = {2,3,4,5},那么调用reverseList(head->next)的正确返回值是{5,4,3},而当前输入的正确返回值是{5,4,3,2}。此时我们需要将3->next = 2,2->next = nullptr。这里需要对链表结构有一些直觉,发现其实当前输入head的地址停留在2,且它的下一个地址即3,那么3->next = 2可以写为head->next->next = head, head->next = nullptr。最后是递归终止条件,这个比较容易想到。
ListNode* reverseList(ListNode* head) {
if(!head || head->next == nullptr)
return head;
ListNode* ans = reverseList(head->next);
head -> next -> next = head;
head->next = nullptr;
return ans;
}

浙公网安备 33010602011771号