链表逆序

解法一:遍历

看了其它的一些解法,都是画一排图,搞得很复杂。其实这道题就是不断的删除一个链表的头节点,再将该节点插到另一个链表的头节点之前。

实现步骤:

①初始化一个新链表的头节点pNewHead = NULL;

②旧链表的头节点后移;

③旧链表不要的节点送给新链表;

④重复②

typedef struct{  
    int data;  
    LinkNode* next;  
}LinkNode;  
  
LinkNode* ReverseLink(LinkNode* pHead)  
{  
    LinkNode *pNewHead=NULL;
    LinkNode *pDiscard=NULL;
    while(pHead)  
    {  
        //旧链表节点后移,丢弃老的头
        pDiscard = pHead->next;  
        pHead = pHead->next;  
        //新链表接受丢弃节点,作为新的头
        pDiscard->next = pNewHead;  
        pNewHead = pDiscard;
    }  
  
    return pNewHead;  
}  

解法二:递归

递归的思路是:

当前节点下一个节点不为NULL,则当前节点保存在栈里,继续处理下一个节点


LinkNode* ReverseLink(LinkNode* pHead)  
{ 
    if(!pHead || !pHead->next)
    {
         return pHead;
    }

    LinkNode *pNewHead = ReverseLink(pHead->next);
    pHead->next->next = pHead;

    return pNewHead;  
}  




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值