剑指offer—反转链表
输入一个链表,反转链表后,输出新链表的表头。
博客中代码均在牛客C++11(clang++ 3.9)中通过
这里提供两种方法:
- 第一种方法就是维护三个指针分别指向当前结点、前一结点、后一结点,不断向后遍历链表,在保存当前结点的后一结点后,让当前结点的next指向前一结点,直到整个链表所有结点全部反转
- 第二种是递归的方法,先走到最后一个结点并保存作为新链表的头结点返回,然后使用递归的方法不断向前改变结点的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;
}
};