像反转链表这样简单又经典的题目往往是需要我们死记到DNA中的,然而就算对于这道简单的题目,太久不写也会生疏,如何更加有效地记忆这类题目呢?除了阶段性的复习以外,我的心得是记忆标志性变量。
我所了解的链表反转大概有四种解法,原文在这里(单链表反转详解(4种算法实现) (biancheng.net))。
我所记的是第四种解法,也就是就地逆置法。
link * local_reverse(link * head) {
link * beg = NULL;
link * end = NULL;
if (head == NULL || head->next == NULL) {
return head;
}
beg = head;
end = head->next;
while (end != NULL) {
//将 end 从链表中摘除
beg->next = end->next;
//将 end 移动至链表头
end->next = head;
head = end;
//调整 end 的指向,另其指向 beg 后的一个节点,为反转下一个节点做准备
end = beg->next;
}
return head;
}
让beg指针的next指向end的next,这样就摘除了end。再让end的next指向head,这样就对节点进行了反转。再移动head,让head指向end,最后移动end,使end指向beg的next。
在记忆这个题目时,我领悟到了一些窍门,那就是记忆关键点。
我总结了以下几点方法论:
-
记忆一个题目,首先记忆标志性变量。在这个题目中,我们需要记住,一共有三个标志性变量,分别是head、beg、end;
-
接下来,记忆标志性变量的变化特征。例如,在一开始,head和beg都指向同一个节点,但是经过迭代之后,beg所指的节点始终都没有变化,而head一直指向链表的头节点。
当记住这两点之后,再遇到这个题目时,不出五分钟就能写出答案了,哪怕是很久没练,生疏了,十分钟之内也能出答案。