1.递归方法
简单来说就是除了空链表和一个结点的链表之外,当结点的下一跳不为空时就继续让下一跳执行倒置。当结点下一跳 为空时,返回该结点给倒数第二个结点,倒数第二个结点将最后一次递归返回的最后一个结点的指针指向自己,然后自己的指针置空,然后返回。依此类推。描述起来有点麻烦,代码比较简介,代码如下:
List Reverse(List i){
if(iNULL){
return NULL;
}
if(i->NextNULL){
return i;
}
List temp=Reverse(i->Next);
temp->Next=i;
i->Next=NULL;
return i;
}
时间复杂度O(N),空间复杂度O(N).
2.非递归方法
非递归方法与递归方法在时间复杂度上没有区别,但是空间复杂度为常量。
思路是从第一个结点依次往后扫描,用一个pre结点保存当前结点,一个next结点保存下一个结点,最开始pre和next置空,然后next保存当前结点的next,i的Next指向pre,然后pre保存当前结点,依次遍历所有结点,最后返回最后一个结点
代码如下:
List Reverse(List i){
if(iNULL){
return NULL;
}
if(i->NextNULL){
return i;
}
List pre =NULL;
List next=NULL;
while(i!=NULL){
next=i->Next;
i->Next=pre;
pre=i;
i=next;
}
return pre;
}
本文深入探讨了链表逆置的两种核心方法:递归和非递归。递归方法利用深度优先搜索原理,通过反转链表节点的指针实现逆置;非递归方法则采用迭代方式,使用额外变量辅助完成逆置过程。两者均实现了链表的逆置,但空间复杂度有所不同。
1456

被折叠的 条评论
为什么被折叠?



