void turn(lnode *&head)
{
if (head == NULL || head->next == head)
return;
lnode *p = head,*q,*qr;
qr = p->next;
while (qr->next != head)
{
q = qr->next;
qr->next = p;
p = qr;
qr = q;
}
qr->next = p;
head->next = qr;
head = qr;
}
注释:先让p指向head,qr是p的后继,qr指向要反转指向的元素,即将该元素原来向后指的指针改为指向前一个元素:
lnode *p = head,*q,*qr;
qr = p->next;
p则是qr的的前驱,其作用是用来让qr可以找到要它要改变的方向。qr是q的前驱,所以q是qr的后继,当前位置的元素指向改变完了,qr就要后移去反转下一个元素的指向,q的作用是让qr能够找到下一个要反转的元素的位置,对应的代码是while循环里的代码。
当qr后指指向的是head时说明反转完成,现在还剩下的任务是让head指针找到新的头节点,如下代码是重置head的指向:
qr->next = p;
head->next = qr;
head = qr;
开头两行(3~4行)判断单链表是否为空或者只有一个元素,因为这样没有反转的必要。