from CodeTop, Leetcode, 206. 反转链表
阿里云一面题。
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
迭代做法(经典题,背过即可)
双指针,后一个节点 b 指向前一个节点 a。一次往后转移一位,由于后指针 next 值改变,需要使用一个临时变量存储后一指针。
迭代完成尾节点指针为 a,将头指针 next 指空,返回 a 即可。
ListNode* reverseList(ListNode* head){
if (!head || !head -> next) return head;
auto a = head, b = head -> next;
while(a && b){
auto c = b -> next;
b -> next = a;
a = b;
b = c;
}
head -> nullptr;
return a;
}
递归做法(经典题,背过即可)
将递归函数看做黑箱,可以返回翻转后的新的头结点,而我们需要做的只是将传入的头结点,也就是调用递归后的尾节点指向他该指向的位置即可。
不理解没关系,背下来,每天写一遍就理解了。
ListNode* reverseList(ListNode* head){
if (!head || !head -> next) return head;
auto tail = reverseList(head->next);
head -> next -> next = head;
head -> next = nullptr;
return tail;
}