反转链表:最直观的想法是,双指针,当链表为空或者链表长度为1时,返回pHead,反之,使用指针p表示头结点,使用指针q表示p的下一个结点,先将p的next指针置为空,然后当p与q均不为空时,使用指针r保存q的下一个结点,接着将p指向q颠倒为q指向p,再将p和q分别后移一位,直至q为空返回p。(在没有头结点的情况下)
ListNode* ReverseList(ListNode* pHead)
{
if(pHead==nullptr||pHead->next==nullptr) //空链表或者长度为一
return pHead;
ListNode *p=pHead,*q=pHead->next,*r=nullptr;
p->next=nullptr; //头结点的下一个结点置为空
while(p&&q)
{
r=q->next; //保存下一个
q->next=p; //颠倒顺序
p=q; //指针后移
q=r; //指针后移
}
return p; //反转后的链表头结点
}
idea:头插法也是链表反转的精髓。(在有头结点的情况下)
ListNode* ReverseList(ListNode* pHead)
{
ListNode *head=new ListNode(-1); //头结点
head->next=nullptr;
ListNode *cur=pHead,*nextcur=nullptr;
while(cur) //当前结点不为空
{
nextcur=cur->next; //保存下一个
cur->next=head->next; //头插法
head->next=cur;
cur=nextcur; //更新当前
}
return head->next; //返回反转后的头结点
}



京公网安备 11010502036488号