反转链表:最直观的想法是,双指针,当链表为空或者链表长度为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; //返回反转后的头结点 }