递归和非递归方法实现链表反转(C语言)

本文深入探讨了链表逆序的两种实现方式:非递归和递归。非递归方法通过迭代更改节点指针方向完成逆序,而递归方法则利用回溯特性,先逆序后续节点再调整当前节点指向,最后详细介绍了基于值交换的递归逆序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非递归:

List Reverse( List L ){
        PtrToNode head,temp;
        if(!L) return;
        head = L;
      
        L =L->Next;
        head ->Next = NULL;
        while(L){
                temp = L;
                L =L->Next;
                temp ->Next =head ;
                 
                head = temp;
        }

        return head;

}

递归:节点连接交换

//递归实现,节点发生改变
//递归回溯法:要点;1.终止条件是什么,然后做什么  2.未达到终止条件的一直递归,跳出递归之后做什么,返回什么条件
List Reverse( List L ){
        //递归到最后一个节点
        if(L != NULL || L ->Next ==NULL){
                return L;
        }
        else{  //递归回溯部分,先反转后边的节点,到最后节点
                List head = Reverse(L->Next);
                //将当前节点设置为后边节点的后继节点
                L->Next->Next = L;
                L->Next = NULL;
                return head;
        }

}

递归:值交换

void swap(int* a, int* b){
        int temp;
        temp = *a;
        *a =*b;
        *b = temp;
}
void SWapList(List L,List head){
        if(L == NULL || L ->Next == NULL){
              swap(&(head->Data),&(L->Data));  
        }
        else{  //递归回溯部分,先反转后边的节点,到最后节点
                SWapList(L->Next,head);
                //将当前节点设置为后边节点的后继节点
                 if (head ->Next !=L) {
                    head = head->Next;
                }
        }

}
//递归回溯,值交换
//递归回溯,值交换
List Reverse( List L ){
        //递归到最后一个节点
        if(!L) return L;
        List head = L;
        List temp =L;
        SWapList(L,head);
        return temp;
}

 

转载于:https://my.oschina.net/1024and1314/blog/3093808

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值