从反转链表领悟到一点算法题目的记忆窍门

106 阅读2分钟

像反转链表这样简单又经典的题目往往是需要我们死记到DNA中的,然而就算对于这道简单的题目,太久不写也会生疏,如何更加有效地记忆这类题目呢?除了阶段性的复习以外,我的心得是记忆标志性变量。

我所了解的链表反转大概有四种解法,原文在这里(单链表反转详解(4种算法实现) (biancheng.net))。

我所记的是第四种解法,也就是就地逆置法。

image.png

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。

image.png

在记忆这个题目时,我领悟到了一些窍门,那就是记忆关键点。

我总结了以下几点方法论:

  1. 记忆一个题目,首先记忆标志性变量。在这个题目中,我们需要记住,一共有三个标志性变量,分别是head、beg、end;

  2. 接下来,记忆标志性变量的变化特征。例如,在一开始,head和beg都指向同一个节点,但是经过迭代之后,beg所指的节点始终都没有变化,而head一直指向链表的头节点。

当记住这两点之后,再遇到这个题目时,不出五分钟就能写出答案了,哪怕是很久没练,生疏了,十分钟之内也能出答案。