Live2D

【数据结构】链表的逆置(图文)

前言

输入的是一条带有头结点的链表L 故头结点为L,第一个节点为L->next.

先上代码

void Reverse(LinkList *L)
{
    LinkList  *p,*q;
    p = L->next;
    L->next = NULL;
    while(p!=NULL)
    {
        q = p;
        p = p->next;
        q->next = L->next;
        L->next = q;
    }

}

讲解(摘自:链表逆置详细讲解(图文)

我们先看第一轮循环做了什么:

建议阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)
image

第二轮:

建议阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)
image

第三轮:

就是头插法

就是头插发

就是头插发

最后给一份带注释的代码~

void listReverse(linkedList &L)
{
	node *p,*s;
	//1.准备工作
	p = L->next;
	L->next = NULL;
	
	while(p)
	{
		//2.1 s记录正在处理的结点,p记录下一轮待处理的结点
		s = p; 			//s承接上一轮记录的位置
		p = p->next; 	//p为下一轮记录位置
		//2.2 把s插入 已逆置的部分 中
		s->next = L->next;  // L->next代表已逆置的第一结点,s的指针域指向它
		L->next = s;	//(头结点的指针域,即)第一结点 设置为s
		//2.2步骤相当于:
		//s 对 队伍(已逆置部分)的队首(已逆置的第一结点)说:你不要排在柜台前了,你排在我后面
		//等队伍排在s后面后,s自己排到了柜台前
	}
}
posted @ 2021-10-10 13:16  主教主  阅读(761)  评论(0编辑  收藏  举报