输入一个链表,反转链表后,输出新链表的表头。

方法1: 定义三个指针,整体右移,边右移,边翻转,这样保证不会断链

    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==nullptr||pHead->next==nullptr)
            return pHead;
        
        ListNode* pfirst=pHead;
        ListNode* psecond=pfirst->next;
        ListNode* pthird=psecond->next;
        
        while(pthird)
        {
            psecond->next=pfirst;//翻转
            
            //指针后移
            pfirst=psecond;
            psecond=pthird;
            pthird=pthird->next;
            
        }
        
        //当只有两个节点或当循环结束时,还剩最后一个节点没有翻转
        psecond->next=pfirst;//翻转
        pHead->next=nullptr;//把原头节点的next设置为空指针
        pHead= psecond;//改变新链表的头节点
        return pHead;
    }

方法2: 定义一个新链表,采用头插的思想进行翻转

ListNode* ReverseList(ListNode* pHead) 
{
    ListNode* newhead=nullptr;
    ListNode* cur=nullptr;
    while(pHead)
    {
        //从原链表中取节点,并将指针后移
        cur=pHead;
        pHead=pHead->next;
            
        //将当前节点头插到新链表中
        cur->next=newhead;
        newhead=cur;
    }        
    return newhead;
}

方法3: 采用递归的思想:先反转当前节点后面的节点,然后将当前节点链接到反转部分的后面

ListNode* ReverseList(ListNode* pHead) {
        if(pHead==nullptr||pHead->next==nullptr)
            return pHead;
        //先反转当前节点的后面的节点
        ListNode* cur=pHead;
        ListNode* preverseList=ReverseList(cur->next);
        
        
        //将当前节点设置为反转后的节点的后续节点
        cur->next->next=cur;
        cur->next=nullptr;
        return preverseList;     
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值