链表逆置有多少种写法?
链表逆置 C 语言
创建所需的相关结构体
1 | struct List |
首先我们创建一个函数用于创建链表的。
建立创建链表的函数
1 | struct List* writeList() |
我们有了链表当然也得有个输出链表内部数据的函数,来验证查看我们链表内的内容。
建立打印链表内容的函数
1 | void printList(struct List* L) |
当然链表申请了内存空间我们就得释放内存空间
建立释放内存空间的函数
1 | void freeList(struct List* head) |
开始正题。
链表逆置
首先我们要明白什么是链表逆置,链表逆置顾名思义,链表的表头和表位改变,打个比方如果链表就是一列火车的话链表逆置以后火车头变成火车尾,第二节车厢会变成倒数第二节车厢,第三节车厢变成倒数第三节车厢以此类推最后火车尾变成火车头。如图所示:
实现逆置的方法
迭代实现逆置
链表迭代逆置的时候需要借助三个指针,这里我们把三个指针定义为 bigin,mid,end 这三个并让他们分别指向如图所示。
begin 指针指向初始化为空 null,mid 指针指向初始化为链表头 head,end 指针指向初始化为第二节点。
准备工作做好了现在就可以开始一个节点一个节点的逆置了。
第一步:mid 指针指向的节点的指针域要与 begin 相同。也就是 mid 指针指向的节点的指针域变成与 begin 相同的值 null。这样子链表第一节点也就是链表头会和其他节点分离出来。
第二步:每个指针都向后移动一个节点准备逆置下一个节点,也就是说 begin 指针指向原链表第一节点也就是头节点,mid 指针指向原链表第二节点,end 指针指向原链表第三节点。
上述步骤可以看下面的解析图。
继续上述操作。
第一步:mid 指针指向的节点的指针域要与 begin 相同也就是指向原链表第一节点原链表的链表头。
第二步:每个指针都向后移动一个节点准备逆置下一个节点。这个时候 begin 指针指向原链表第二节点,mid 指针指向原链表第三节点,end 指针指向原链表第四节点。
如图所示:
继续。
第一步:mid 指针指向的节点的指针域要与 begin 相同也就是指向原链表第二节点。
第二步:每个指针都向后移动一个节点准备逆置下一个节点。这个时候 begin 指针指向原链表第三节点,mid 指针指向原链表第四节点,end 指针指向原链表第四节点的指针域也就是 null。因为原链表已经没有了第五节点所以第四节点就是链表的表尾。
具体步骤解析如图所示。
到了这一步不难发现现在离完成逆置很接近了。接下来我们只需要改变 mid 指针的指向和 head 头指针的指向就好了。
第一步:mid 指针指向的节点的指针域要与 begin 相同也就是指向原链表第三节点。
第二步:这一次我们不需要移动 begin,mid,end 三个指针了,现在我们只需要改变 head 头指针的指向就好了,head 头指针的指向改为和 mid 指针相同。
以下为解析图:
到了这里我们的链表就已经逆置完毕了,这就是用迭代方法逆置链表。
代码实现如下(C 语言):
1 | //迭代逆置法,head 为无头节点链表的头指针 |
递归逆置链表
递归逆置法和迭代逆置法的思想恰好相反,递归逆置法的实现思想是从链表的尾节点开始,依次向前遍历,遍历过程依次改变各节点的指向,即另其指向前一个节点。
递归理解起来要比迭代难一点,我们先附上实现代码,然后一一讲解。
样例代码(C 语言):
1 | struct List* recursion_reverseList(struct List* head) |
接下来我们用图去一一分析递归逆置链表的过程。
刚开始函数向内递归链表被切成很多子链表。
现在开始递归向外层,一层一层退出。并进行子链表的逆置衔接。完成逆置。
头插法逆置链表
头插法比较好理解。在原有链表的基础上,依次将位于链表头部的节点摘下,然后采用从头部插入的方式生成一个新链表,则此链表即为原链表的逆置版。
具体操作如图
代码实现(C 语言):
1 | struct List* head_reverse(struct List* head) |
就地逆置法逆置链表
就地逆置法和头插法的实现思想类似,唯一的区别在于,头插法是通过建立一个新链表实现的,而就地逆置法则是直接对原链表做修改,从而实现将原链表反转。在原链表的基础上做修改,需要额外借助 2 个指针(假设分别为 beg 和 end)。
初始状态下, beg 指针 指向第一个节点,end 指针指向 beg->next,也就是原链表的第二节点。如下图:
接下来将 end 所指节点 2 从链表上摘除,然后再添加至当前链表的头部。如图所示。
我们继续上面的操作。
再来一次我们就完成逆置了。
最后我们就完成了链表的逆置。
代码实现(C 语言):
1 | struct List* local_reverse(struct List* head) |
原文地址 blog.csdn.net