算法说明

       链表的逆置的算法核心是利用多个指针的移动来实现,本文的实现中就是利用了4个指针,但是实际上参与两个节点(元素)的逆置是通过其中三个指针来实现的。多余的指针(下文代码中为F)并不是没有作用的,它是用于将逆置后的首元素(即、第一个节点)的指针域指向NULL,如果没有这一步,在打印输出链表L时,由于循环只是将第2个节点的next指向第1个节点,第1个节点的next仍然指向第2个节点,将形成一个死循环。


需要逆置的单链表

2.单链表逆置_List

逆置过程图解

2.单链表逆置_List_02

具体代码
//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