单链表的转置
今天我们的任务是讲一讲单链表中的一个重要应用,单向链表的就地逆转。大概题意是这样叙述的;首先给定一个单向链表L,要求我们设计一个函数将链表L就地逆转,即不需要申请新的结点,将链表的第一个元素转为最后一个元素,第二个元素转为倒数第二个元素,然后以此类推,看到这个问题我们首先要明白的是解决这个问题的基本思路是什么,那就是利用循环,从链表头开始逐个处理。我们先设想一下这个的场景:就是在每轮循环开始前我们都是面临两个链表,其中Old_head是一个待逆转的链表(即“旧”的链表头),而New_head是一个已经逆转好的链表(即“新”的链表头),而每轮循环的目地是把Old_head中的第一个元素插入到New_head的头上,这轮循环执行好后,Old_head和New_head还是分别指向新的待逆转的链表和已经逆转好的链表。再循环执行前,Old_head和New_head都应该初始化,即:待逆转的链表Old_head就是原始链表,已经逆转好的链表New_head开始时为空。而循环结束后,需要将逆转后的链表头指针(New_head )返回,而循环的主体部分就是将Old_head的第一个元素插入到New_head头上,同时更新Old_head和New_head的值,当将Old_head 的第一元素插入到New_head头上后,我们需要用一个临时变量Temp来记录Old_head链表新的表头在哪里,我们给出逆转函数的代码
List Reverse(List L) { PtrToNode Old_head,New_head,Temp; Old_head=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; return L; }