给出单链表的头节点head,反转链表。
法一:双指针迭代
我们给出两个指针pre和cur,最初pre指向空且cur指向头节点,然后遍历链表。每次迭代到cur都将cur的next指向pre,然后pre和cur都后移一位。最后cur指向空,pre指向尾节点。
中途还会用到一个tmp变量,它用来存储cur的下一个节点便于pre和cur后移。
class Solution
{
public:
ListNode* reverseList(ListNode* head)
{
ListNode*pre=nullptr;
ListNode*cur=head;
while(cur!=nullptr)
{
ListNode*tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
};
法二:递归
先上代码
class Solution
{
public:
ListNode* reverseList(ListNode* head)
{
if(head==nullptr||head->next==nullptr)
{
return head;
}
ListNode*cur=reverseList(head->next)//这里cur为最后一个节点
//head为4
head->next->next=head;
head->next=nullptr;//防止列表循环
return cur;
}
};
解释:假设一个链表为[1,2,3],一开始传入1那个节点,不满足return条件,继续跑代码,需要递归调用该函数,于是传入2那个节点,不满足return条件,继续跑代码,需要递归调用该函数,传入3那个节点,满足return条件,那么直接return,所以cur就是最后一个节点3.由于head->next为3,那么head就为倒数第二个节点
那么就最后一个节点,继续接下来的代码。head->next为最后一个节点,现在将这最后一个节点的next调整为指向倒数第二个节点(也就是head)。但这时候head的next还是指向最后一个节点,所以应该让head的next指针指向空,防止尾节点与倒数第二个节点形成循环。
最顶层的函数调用结束了,出栈。下一层函数调用开始执行,也就是将2指向1.
以此类推就可以反转链表。
842

被折叠的 条评论
为什么被折叠?



