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

链表逆置详细讲解(图文)链表逆置 前言链表逆置是初学时有困扰到我的难点.由于链表头结点可放可不放数据,所以写代码时候**->next**用的云里雾里。这里讲解头结点与第一结点区分的情况,即头结点你把它看作这个链表的“文件名”就行。若头结点为L,则第一结点为L->next。 代码voidlistReverse(linkedList&L){ node*p,*s; //1. p=L->next; L->next=NULL; while

链表逆置

 

前言

链表逆置是初学时有困扰到我的难点.

由于链表头结点可放可不放数据,所以写代码时候 ->next 用的云里雾里。

这里讲解头结点与第一结点区分的情况,即头结点你把它看作这个 链表的“文件名” 就行。
若头结点为L,则第一结点为L->next。

 

代码

void listReverse(linkedList &L)
{ 
   
	node *p,*s;
	//1.
	p = L->next;
	L->next = NULL;
	
	while(p)
	{ 
   
		//2.1
		s = p; 
		p = p->next;
		//2.2
		s->next = L->next; 
		L->next = s;
	}
}

看不懂别慌。我会把代码拆解成三块为你讲解。
讲解前,先做一个理解工作,以 L->next 为例,按在表达式边or边分,存在两种情况:

情况一(左):L->next = NULL;

重点在next,即L的指针域,该表达式将指针域指向NULL。

情况二(右):p = L->next;

重点在 L->next 整体, 即 L->next 这个结点,->next在这里就是个形式,目的还是为了告诉你是这个结点!该表达式将p指针指向结点L->next。

 

讲解

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

建议阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)
 
链表逆置详细讲解(图文)
 
 

第二轮:
 
建议阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)
链表逆置详细讲解(图文)

第三轮省略(可以自己尝试)。
 
 

总结

不难发现:

  • 链表逆置利用了s、p两个指针移动实现

  • 每一轮循环体执行结束后,s指向刚刚逆置成功的结点,p指向下一轮待逆置的结点

  • 为什么需要p?
    因为2.2步骤中s->next会被改写
    若只有s,会丢失剩余的结点
    这时候p起到暂存的作用,等待下一轮2.1步骤中的s=p找到它。

 
 

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

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自己排到了柜台前
	}
}

 
 
有问题可以评论区交流讨论哈~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36944.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注