算法说明
链表的逆置的算法核心是利用多个指针的移动来实现,本文的实现中就是利用了4个指针,但是实际上参与两个节点(元素)的逆置是通过其中三个指针来实现的。多余的指针(下文代码中为F)并不是没有作用的,它是用于将逆置后的首元素(即、第一个节点)的指针域指向NULL,如果没有这一步,在打印输出链表L时,由于循环只是将第2个节点的next指向第1个节点,第1个节点的next仍然指向第2个节点,将形成一个死循环。
需要逆置的单链表
逆置过程图解
具体代码
//12.单链表逆置(头节点还是头节点,首/第一个节点变成尾节点,尾节点变成首节点)
Linklist Inverse_List(Linklist* L){
assert(L);
//链表不存在或为空
if ((*L) == NULL || (*L)->next == NULL)return NULL;
Linklist P, T, Q, F;
P = (*L);
F = T = P->next;//第一个节点 (*L)->next
Q = T->next;//第二个节点 (*L)->next->next
//链表只有一个元素:直接返回
if (Q == NULL) return P;
//逆置
while (Q != NULL){
P = T;
T = Q;
Q = Q->next;
T->next = P;
}
//此时T指向尾节点
F->next = NULL;
(*L)->next = T;
return (*L);
}
运行结果
33 3 6 23 34 //逆置前
34 23 6 3 33 //逆置后
请按任意键继续. . .
作者:QuestoQ