方法1: 定义三个指针,整体右移,边右移,边翻转,这样保证不会断链
ListNode* ReverseList(ListNode* pHead) {
if(pHead==nullptr||pHead->next==nullptr)
return pHead;
ListNode* pfirst=pHead;
ListNode* psecond=pfirst->next;
ListNode* pthird=psecond->next;
while(pthird)
{
psecond->next=pfirst;//翻转
//指针后移
pfirst=psecond;
psecond=pthird;
pthird=pthird->next;
}
//当只有两个节点或当循环结束时,还剩最后一个节点没有翻转
psecond->next=pfirst;//翻转
pHead->next=nullptr;//把原头节点的next设置为空指针
pHead= psecond;//改变新链表的头节点
return pHead;
}
方法2: 定义一个新链表,采用头插的思想进行翻转
ListNode* ReverseList(ListNode* pHead)
{
ListNode* newhead=nullptr;
ListNode* cur=nullptr;
while(pHead)
{
//从原链表中取节点,并将指针后移
cur=pHead;
pHead=pHead->next;
//将当前节点头插到新链表中
cur->next=newhead;
newhead=cur;
}
return newhead;
}
方法3: 采用递归的思想:先反转当前节点后面的节点,然后将当前节点链接到反转部分的后面
ListNode* ReverseList(ListNode* pHead) {
if(pHead==nullptr||pHead->next==nullptr)
return pHead;
//先反转当前节点的后面的节点
ListNode* cur=pHead;
ListNode* preverseList=ReverseList(cur->next);
//将当前节点设置为反转后的节点的后续节点
cur->next->next=cur;
cur->next=nullptr;
return preverseList;
}