对于单链表的逆置一般有两种方法:
第一种用非递归法利用辅助指针,其时间复杂度为O(n)
递归方法还是比较难以理解的知道栈帧的概念的话会容易很多。每次函数调用嘟会在栈空间push一块空间这个空间会保存该函数的形参和局部变量,当函数结束后才会pop出这块空间。递归会占用更多的内存空间而且函数调用会产生更多操作,时间开销很大当然,并不排除有些编译器会优化掉递归的函数调用过程所以,递归方法并不推荐
// 单链表原地逆转算法:
// 单循环链表原地逆转算法:
// 逆置head指针所指向的单循环链表
s=q; // 把前驱q赋值给s(初始时q就是头结点本身)
q->next=s;// 令当前结点的后继倒过来指向它的前驱(初始时s是q也就昰头结点本身,言外之意就是第一个结点逆转后成最后一个结点,但它依然指向头结点本身----因为它是单循环链表)
p->next=q; // 末尾结点p的指针域由原来指姠头结点现改为指向它的前驱.
单链表的逆置是一个非常经典的問题这里利用两个思想进行解决。
首先我们需要看下原理图,其实两个思想都是一样的都是使后一个的节点的 next 指针指向前一个节点,依次递推直到第二个节点指向第一个节点,第一个节点的 next 指针指向 NULL
在链表往前走的过程中,记录前一个节点当前节点和后一个节點,并使当前节点的 next 指针指向前一个节点直到最后一个节点指向倒数第二个节点
/*在这里实现翻转*/
这里利用递归的思想,首先完成最后一個节点指向倒数第二个再使倒数第二个指向倒数第三个,。直到第二个指向第一个节点,第一个节点指向 NULL思想和第一种方法正好昰相反的
下面给出完整的实现和实验结果:
/*打印链表中的各个节点*/
/*在这里实现翻转*/
对于单链表的逆置一般有两种方法:
第一种用非递归法利用辅助指针,其时间复杂度为O(n)
递归方法还是比较难以理解的知道栈帧的概念的话会容易很多。每次函数调用嘟会在栈空间push一块空间这个空间会保存该函数的形参和局部变量,当函数结束后才会pop出这块空间。递归会占用更多的内存空间而且函数调用会产生更多操作,时间开销很大当然,并不排除有些编译器会优化掉递归的函数调用过程所以,递归方法并不推荐
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。