栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言单链表的逆置

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言单链表的逆置

单链表的逆置

方法一:头插

void Reverse(Node* plist) {
	assert(plist != NULL&&plist->next!=NULL);

	Node* p = plist->next;
	Node* q;
	plist->next = NULL;
	while (p != NULL) {
		q = p->next;
		p->next = plist->next;
		plist->next = p;
		p = q;
	}
}

方法二: 通过三个指针不借助头节点

定义三个指针分别指向头节点后的三个元素

再将 p->next =NULL;

进行循环

使q->next = p; 改变指针指向

再将p q r 三个指针同时向后移动

直至q为NULL 再将plist (头节点)指向p 即可

void Reverse1(Node* plist) {
	assert(plist != NULL && plist->next != NULL);
	Node* p = plist->next;
	Node* q = p->next;
	Node* r;
	p->next = NULL;
	while (q != NULL) {
		r = q->next;
		q->next = p;
		p = q;
		q = r;
	}
	plist->next = p;
}

单链表的逆置 (首元素节点与尾元素节点不变其余节点逆置)

单链表逆置的变种 :

这里采用方法一

定义四个节点,z保存 头节点和首元素节点

r节点保存要第二个元素节点的地址 

p 和 q节点进行头插操作

完整代码

void Reverse01(ListNode* plist) {  //首节点和尾节点不变
	//assert
	ListNode* z = plist->next;
	ListNode* p = z->next;
	ListNode* q=NULL;
	ListNode* r = p;
	z->next = NULL;
	while (p != NULL) {
		if (p->next == NULL) {	
			break;
		}
		q = p->next;
		p->next = z->next;
		z->next = p;
		p = q;
	}
	r->next = p;
	
}

图解

while前操作

 while循环结束 (中间节点逆置完成)

 最后将r指向p节点即可

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311506.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号