剑指offer---反转链表

本文介绍两种反转链表的方法:迭代与递归。通过维护三个指针或使用递归调用,实现链表的反转,并返回新的链表头结点。提供了详细的C++代码实现。

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

剑指offer—反转链表

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

博客中代码均在牛客C++11(clang++ 3.9)中通过

这里提供两种方法:

  1. 第一种方法就是维护三个指针分别指向当前结点、前一结点、后一结点,不断向后遍历链表,在保存当前结点的后一结点后,让当前结点的next指向前一结点,直到整个链表所有结点全部反转
  2. 第二种是递归的方法,先走到最后一个结点并保存作为新链表的头结点返回,然后使用递归的方法不断向前改变结点的next指向,直到整个链表所有结点全部反转

代码如下:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/

// 第一种方法:
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==NULL||pHead->next==NULL) 
            return pHead;
        ListNode* pPre = nullptr;
        ListNode* pNode = pHead;
        ListNode* pNext = pHead;
        
        while(nullptr != pNode)
        {
            pNext = pNode->next;
            if(nullptr == pNext)
                pHead = pNode;
            pNode->next = pPre;
            pPre = pNode;
            pNode = pNext;
        }

        return pHead;
    }
};

// 第二种方法---递归:
class Solution {
public:
     ListNode* ReverseList(ListNode* pHead) {
        //如果链表为空或者链表中只有一个元素
        if(pHead==NULL||pHead->next==NULL) return pHead;
         
        //先反转后面的链表,走到链表的末端结点
        ListNode* pReverseNode=ReverseList(pHead->next);
         
        //再将当前节点设置为后面节点的后续节点
        pHead->next->next=pHead;
        pHead->next=NULL;
         
        return pReverseNode;
     }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值