单向列表的逆转
将给定一个单链表L,使用自行设计的函数 Reverse将链表L就地逆转,在不申请新的结点的情况下,
将链表的第一个元素转为最后一个元素,第二个元素转为倒数第二个元素,以此类推。
分析思路
利用循环,从链表头开始逐个处理。循环设计中如何把握住循环不变式。
循环不变式:一种在循环过程进行时不发生改变的性质,不依赖于前面所执行过程的重复次数的多少。
在每轮循环开始前我们都面临两个链表,其中 Old_head是一个待逆转的链表(“旧”的链表头),而New_head是一个已经逆转好的链表(“新”的链表头) ,每轮循环的目的是把Old_head 中的第一个元素插入到New_head的头上,这轮循环执行好后,0ld_head 和 New_head还是分别指向新的待逆转链表和已经逆转好的链表。
实现代码
tpyedef struct Node *PtrToNode;
struct Node {
ElementType Data; //存储结点数据
PtrToNode Next;
};
List Reverse(list L){
/*将单向链表L逆转*/
PtrToNode Old_head, New_head, Temp;
Old_head = L; //初始化就表头为L
New_head = NULL; // 初始化逆转后新表头为空
while(Old_head){ //就表不为空
Temp = Old_head->Next;
Old_head->Next = New_head;
New_head = Old_head; //将但钱表头逆转为新表头
Old_head = Temp; //更新就表头
}
L = New_head; //更新L
return L;
};
实现过程无声讲解:
单向链表的逆转
需要ppt自取
我用夸克网盘分享了「单向链表的逆转.pptx」,链接:https://pan.quark.cn/s/f51426c1807c