面试经典题-单链表反转
1 2 3 4 | struct node{ node* next; T value; }; |
方法一:常规方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | node* reverse(node*& head) { if ( (head == Null) || (head->next == Null) ) return head; // 边界检测 node* pNext = Null; node* pPrev = head; // 保存链表头节点 node* pCur = head->next; // 获取当前节点 while (pCur != Null) { pNext = pCur->next; // 将下一个节点保存下来 pCur->next = pPrev; // 将当前节点的下一节点置为前节点 pPrev = pCur; // 将当前节点保存为前一节点 pCur = pNext; // 将当前节点置为下一节点 } head->next = NULL; head = pPrev; return head; } |
方法二:递归
1 2 3 4 5 6 7 8 9 10 11 12 | node* reverse( node* pNode, node*& head) { if ( (pNode == Null) || (pNode->next == Null) ) // 递归跳出条件 { head = pNode; // 将链表切断,否则会形成回环 return pNode; } node* temp = reserve(pNode->next, head); // 递归 temp->next = pNode; // 将下一节点置为当前节点,既前置节点 return pNode; // 返回当前节点 } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步