今天做一道单向链表逆置的题,又被绕晕了,特意百度找了一个
(反正我看懂了)
单链表的逆置--普通循环方法(详细图解)
诚如很多人所说,吃透这个还是要自己画一个详细的过程图。今天就给大家介绍一下(普通的循环方法)我学习下来的一些经验,如有不对之处还望大家一起交流。
首先,以下是关于单链表逆置的普通循环方法的代码:
//单链表定义
typedef struct ListNode{
int m_nValue;
ListNode* pNext;
};
//单链表逆置实现
ListNode* ReverseList(ListNode* pHead)
{
if (pHead == NULL || pHead->pNext == NULL)
{
retrun pHead;
}
ListNode* pRev = NULL;
ListNode* pCur = pHead;
while(pCur != NULL)
{
ListNode* pTemp = pCur; // 步骤①
pCur = pCur->pNext; // 步骤②
pTemp->pNext = pRev; // 步骤③
pRev = pTemp;
}
return pRev;
}
下面我们来用图解的方法具体介绍整个代码的实现流程:
初始状态:
第一次循环:
第一次循环过后,步骤①:pTemp指向Head,步骤②:pCur指向P1,步骤③:pTemp->pNext指向NULL。
此时得到的pRev为:
第二次循环:
第二次循环过后,步骤①:pTemp指向P1,步骤②:pCur指向P2,步骤③:pTemp->pNext指向Head。
此时得到的pRev为:
第三次循环:
第三次循环过后:步骤①:pTemp指向P2,步骤②:pCur指向P3,步骤③:pTemp->pNext指向P1。
此时得到的pRev为:
第四次循环:
第四次循环过后:步骤①:pTemp指向P3,步骤②:pCur指向NULL,步骤③:pTemp->pNext指向P2。
此时得到的pRev为:
至此,单链表的逆置完成。