16. 反转链表

本文介绍了如何通过递归方法反转链表,详细解析了反转过程,并提供了相应的代码实现。

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

题目描述

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

struct ListNode
{
    int       m_nValue;
    ListNode* m_pNext;
};

解析

链表反转中,需要三个链表指针,一个指向当前被修改指针域的结点pNode,一个保存上一个结点pPrev,一个保存下一个需要被修改的结点pNext。

实现

ListNode* ReverseList(ListNode* pHead){
    if (pHead == NULL)
        return NULL;
    ListNode* pNode = pHead;   //pNode指向当前修改指针的结点
    ListNode* pPrev = NULL;    //当前修改结点的前一个结点
    while (pNode != NULL){
        ListNode* pNext = pNode->m_pNext;  //需要保持下一个要被修改的结点
        pNode->m_pNext = pPrev;
        pPrev = pNode;
        if (pNext == NULL)
            return pNode;
        pNode = pNext;
    }
}

递归实现

//递归实现
ListNode* ReverseList(ListNode* pHead){
    if (pHead == NULL || pHead->m_pNext == NULL)
        return pHead;
    ListNode* newHead = ReverseList(pHead->m_pNext); //先反转当前结点后面的链表
//完成当前结点后面的链表的反转,此时pHead没有断开与后续链表的链接,可以通过PHead找到已经反转链表的尾结点
    pHead->m_pNext->m_pNext = pHead;   
    pHead->m_pNext = NULL;
    return newHead;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值