单链表的逆置

 

方法一:头插

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->next!= NULL) {
		q = p->next;
		p->next = z->next;
		z->next = p;
		p = q;
	}
	r->next = p;
	
}

图解

while前操作

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

 最后将r指向p节点即可

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐