逆置算法看不太懂,谁能解析一下?(越详细越好)

void invert(DuLinkList*&L)
{
DuLinkList* p = L->next;
DuLinkList* q;
L->next = NULL;
while (p != NULL)
{
q = p->next;
p->next = L->next;
p->prior = q;
L->next = p;
p = q;
}
}

供参考:

//带头结点的双向链表的就地逆置
void invert(DuLinkList*& L)
{
    DuLinkList* q;
    DuLinkList* p = L->next; // 将 p 指向链表 L 的第一个结点,同时将头结点L从链表中脱离
    L->next = NULL;          // 成一个独立的结点
    while (p != NULL) // 此时 p 指向链表的第一个结点
    {
        q = p->next; // q 指向链表的第二个结点,即 p结点的下一个结点
        p->next = L->next; //头插法将第一个结点 p 链入头结点 L
        p->prior = q;  //将 p 结点前驱指针修改为指向 第二个结点 q  
        L->next = p; //头插法将第一个结点 p 链入头结点 L
        p = q; //上述动作完成后,让 p 指向第二个结点 q ,准备第二个结点的 逆置
    }
}