如何逆置一个单链表(两种方法)?

在做关于单链表的一些算法题的时候,往往需要将单链表逆置后操作更加方便,但是一般说起来逆置,常用循环遍历单链表,使用头插法再次创建一个单链表实现逆置,但是这样不仅有点浪费存储空间,而且还容易搞混,那么如果要求空间复杂度为O(1)的话,那么就更不能使用头插法实现逆置了。

这时可以采用特定的算法实现单链表逆置,它的思想大概是这样的:

从头到尾扫描单链表,通过特定的手段使后面的一个结点依次指向前面的一个结点,这样,一个循环下去,那么这个单链表就实现了逆序操作。

即从
A---->A---->A----->A------>A----->A----->
变为
<-----A<-----A<-----A<-----A<-----A<-----A

可能似乎有点难以理解,我自己写了写草稿纸和代码,希望可以帮助大家理解:

在这里插入图片描述

因为最近在考研,时间紧,可能写的有点不规矩,嘿嘿,望谅解

C语言实现:

//将一个单链表 L 就地逆序存放 

LinkList ReverseList(LinkList &L){
    
    
	if(L->next == NULL)					//若单链表为空则直接返回 
		return L;
		
	LNode *q = L, *p = L->next, *temp;	//定义q指针指向前一个元素,p指针指向后一个元素,temp为临时指针 
	q->next = NULL;						//将即将形成的链表链尾的指针域置 NULL 
	while(p != NULL){
    
    
		q->data = p->data;				//将后一个元素的值赋值给前一个元素 
		temp = p->next;				//temp暂时记录下一元素 
		p->next = q;				//p指针此时反向指向q,即q将作为p的后继指针 
		q = p;						//q指针后挪 
		p = temp;					//p指针后挪 
	}
	
	q->data = 0;				//将最后形成的头结点数据域清 0
	L = q;						//最终 将 q赋值给 L 作为头结点 
	return L;
}

运行截图:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43479947/article/details/117575796