在做关于单链表的一些算法题的时候,往往需要将单链表逆置后操作更加方便,但是一般说起来逆置,常用循环遍历单链表,使用头插法再次创建一个单链表实现逆置,但是这样不仅有点浪费存储空间,而且还容易搞混,那么如果要求空间复杂度为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 = https://www.it610.com/article/p->data;
//将后一个元素的值赋值给前一个元素
temp = p->next;
//temp暂时记录下一元素
p->next = q;
//p指针此时反向指向q,即q将作为p的后继指针
q = p;
//q指针后挪
p = temp;
//p指针后挪
}
q->data = https://www.it610.com/article/0;
//将最后形成的头结点数据域清 0
L = q;
//最终 将 q赋值给 L 作为头结点
return L;
}
运行截图:
文章图片
推荐阅读
- 计算机综合基础(408)|大端方式 and 小端方式(数据的存储方式)
- 计算机综合基础(408)|设CPU有16根地址线,8根数据线,并用MREQ作为访存控制线号......存储器与CPU的连接
- [ 数据结构 -- 手撕排序算法第一篇 ] 插入排序
- 不含回文的最长子字符串的长度
- 使用Fenwick树在L到R范围内大于K的元素数(离线查询)
- 十进制等效项大于或等于K的子字符串的计数
- 修改给定数组以使奇数和偶数索引元素的总和相同
- Java程序打印字符串的不同排列
- 按字典顺序,给定字符串的所有最短回文子字符串