如何实现单链表的反转
原理:
反转一个链表,需要调整指针的方向,而与指针操作相关代码总是容易出错的。
例如: 1、m、n是3个相邻的结点,假设经过若干步操作,已经把结点i之前的指针调整完毕,这些节点的m_pNext指针都是指向前面一个结点。现在
遍历到结点m,当然需要调整结点的m_pNext指针,让它指向结点1,但是注意的是,一旦调整了指针的指向,链表就断开了,因为已经没有指针指向
结点n,没有办法再遍历到结点n了,因此为了避免链表断开,需要在调整m的m_pNext之前要把n保存下来。接下来试着找到反转后链表的头结点,不
难分析出链表的头结点是原始链表的尾结点,即m_pNext为空指针的节点。
具体实现过程如下:
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
}
ListNode* Reverselteratively(ListNode* pHead)
{
ListNode* pReversedHead = NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while(pNode != NULL)
{
ListNode* pNext = pNode->m_pNext; //保存后驱节点
if(pNext == NULL)
{
pReversedHead =pNode;
}
pNode -> m_pNext = pPrev;//将节点的指针指向前驱节点
pPrev = pNode;//将节点变成前驱节点
pNode = pNext; //将保存下来的后驱节点变成节点
}
return pReversedHead;
}
说明: 节点分为: 前驱节点 节点 后驱节点
优质内容筛选与推荐>>