题目要求:
给定一个链表,请设计函数Reverse将链表L就地逆转,即不需要申请新的节点,将单向链表的第一个节点变为最后一个节点,第二个变为倒数第二个。
分析:
比较明显,解决该问题的基本思路是:利用循环,从链表头开始逐个处理。循环设计中,最核心的要点是如何找出,循环不变式:表示一种在循环过程进行时不变的性质,不依赖于前面所执行过程的重复次数的断言。
想象一个场景,每次前我们都应面对两个链表,其中Old_head是一个待逆转的链表,即旧的链表头,而New_head是一个新的已经逆转好的链表(即“新”表头,)每次循环的目的是把old元素的第一个元素插到New_head的头上,这轮循环执行好以后,Old_head和New_head还是分别指向新的待逆转链表和已经逆转好的链表。
节点指针命名为PtrToNode,阅读方便,单链表类型命名为List,主要是方便分别给出的变量到底是个链表头,还是一个单个节点
代码如下:
List Reverse(List L)
{
List New,Old;
PtrToNode Temp;
New= NULL;Old= L;
while(Old)
{
temp = Old;
Old= Old->next;
temp->next=New;
New=temp;
}
return New;
}