C++反转链表
Posted 久病成良医
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++反转链表相关的知识,希望对你有一定的参考价值。
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
双指针思路
首先判断链表是否为空,为空则返回nullptr。
接下来定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。
然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。
接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。
最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==nullptr) //对空链表的判断
return nullptr;
ListNode* per=nullptr;
ListNode* cur=head;
ListNode* temp; //建立一个指针
while(cur){ //没必要写 while(cur!=nullptr),写了这个还要判断cur,会浪费时间,直接cur就可以
temp=cur->next; //保存cur的下一个节点
cur->next=per; //cur的下一个节点指向per,实现反转
per=cur; //cur=per;错误,是把cur的节点赋值给per
cur=temp; //temp=cur;错误,是把temp(原来的cur->next)的节点赋值给cur
}
return per;
}
};
递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverse(ListNode* per,ListNode* cur){ //返回的是一个链表,其返回值是指针
if(cur==nullptr) //递归的终止条件
return per;
ListNode* temp=cur->next;
cur->next=per;
return reverse(cur,temp); // 调用要写return
}
ListNode* reverseList(ListNode* head) {
if(head==nullptr) //链表判空
return nullptr;
return reverse(NULL,head); // 调用要写return
}
};
以上是关于C++反转链表的主要内容,如果未能解决你的问题,请参考以下文章