题外话:工作2年第一次写链表反转emmm,刷的题还是不够TT
开始正题!
思路:
1)如果链表为空或者只有一个节点,那肯定就不需要做反转操作啦;
2)借助p1和p2两个指针对链表进行遍历,每次将p2->next指向前面的p1;
3)遍历的条件是p1和p2都不是空指针,所以遍历结束后p1就是新的首节点;
4)最后不要忘记尾结点和它的next指向空指针。
画了简单的流程图:
上代码:
(完整代码见https://blog.csdn.net/SanShuiGeGe/article/details/124067370)
/* 节点结构,next指针和T类型数据 */
template<typename T>
class Node{
public:
T ele;
Node *next;
Node(){next=nullptr;}
};
/* 无头节点的单向链表 */
template<typename T>
class SingleList{
private:
Node<T> *m_nodeHead;//首节点
Node<T> *m_nodeTail;//尾结点
}
template<typename T>
void SingleList<T>:: reverse(void)
{
Node<T> *p0 = nullptr;
Node<T> *p1 = nullptr;
Node<T> *p2 = nullptr;
if(m_nodeHead == m_nodeTail)
{
return;
}
p1 = m_nodeHead;
p2 = m_nodeHead->next;
m_nodeTail = p1;
m_nodeTail->next = nullptr;
while(p1 != nullptr && p2 != nullptr)
{
p0 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p0;
}
m_nodeHead = p1;
}