力扣206,反转链表
题目描述
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
输入输出样例
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
输入:head = [1,2]
输出:[2,1]
输入:head = []
输出:[]
解法一,利用堆栈使用迭代
ListNode* reverseList(ListNode* head) {
//创建堆栈保存结点
stack<ListNode *>stk;
ListNode *ptr=head;
while(ptr!=nullptr)
{
stk.push(ptr);
ptr=ptr->next;
}
ListNode *res=new ListNode();
ptr=res;
while(!stk.empty())
{
ListNode *temp=stk.top();
stk.pop();
ptr->next=temp;
ptr=temp;
}
ptr->next=nullptr;
return res->next;
}
解法二,使用双指针迭代
//使用双指针迭代
ListNode* reverseList2(ListNode* head) {
ListNode *pre,*cur;
pre=nullptr;
cur=head;
while(cur!=nullptr)
{
//cur 保存的原来的链表
//temp 指向接下来要走的链表
ListNode*temp=cur->next;
//倒叙操作
cur->next=pre;
pre=cur;
//重新指向原来的
cur=temp;
}
return pre;
}
解法三,使用双指针递归
//双指针使用递归的思想
ListNode* reverseList3(ListNode* head) {
if(head==nullptr||head->next==nullptr)
{
return head;
}
//一直挪到最后才执行下一步操作
ListNode *cur=reverseList3(head->next);
//将下一个结点的指向上一个结点
head->next->next=head;
head->next=nullptr;
//但会最后一个结点
return cur;
}