1 /*
2 定义一个函数 输入一个链表的头结点 反转该链表并输出反转后链表的头结点
3 struct ListNode
4 {
5 int m_nKey;
6 ListNode* m_pNext;
7 };
8 解决链表相关的问题总是有大量的指针操作 而指针的操作的代码总是容易出错的 很多面试官喜欢出链表相关的问题 就是想通过指针操作来考察应聘者的编码功底 为了避免出错 我们最好> 先进行全面的分析
9 在调节结点的m_pNext指针时,除了徐亚知道结点本身之外,还需要知道结点的前一个结点 因为我们需要把结点的m_pNext指向其前一个结点,并且需要保存结点的后一个结点,以防止结点> 断开。所以我们需要定义3个指针,分别指向当前遍历到的结点、它的前一个结点及后一个结点
10 最后试着找到反转后链表的头结点,不难分析出反转后链表的头结点是原始链表的尾结点。
11 */
2 定义一个函数 输入一个链表的头结点 反转该链表并输出反转后链表的头结点
3 struct ListNode
4 {
5 int m_nKey;
6 ListNode* m_pNext;
7 };
8 解决链表相关的问题总是有大量的指针操作 而指针的操作的代码总是容易出错的 很多面试官喜欢出链表相关的问题 就是想通过指针操作来考察应聘者的编码功底 为了避免出错 我们最好> 先进行全面的分析
9 在调节结点的m_pNext指针时,除了徐亚知道结点本身之外,还需要知道结点的前一个结点 因为我们需要把结点的m_pNext指向其前一个结点,并且需要保存结点的后一个结点,以防止结点> 断开。所以我们需要定义3个指针,分别指向当前遍历到的结点、它的前一个结点及后一个结点
10 最后试着找到反转后链表的头结点,不难分析出反转后链表的头结点是原始链表的尾结点。
11 */
12
13 ListNode* ReverseList(ListNode* pHead)
14 {
15 ListNode* pReversedHead = NULL; //反转后的头结点
16 ListNode* pNode = pHead; //当前结点
17 ListNode* pPrev = NULL; //当前结点的前一个结点
18 while(pNode != NULL) //循环结束条件
19 {
20 ListNode* pNext = pNode->m_pNext; //当前结点的下一个结点
21
22 if(pNext == NULL) //原始链表的尾结点
23 pReversedHead = pNode; //反转之后的头结点
24 pNode->m_pNext = pPrev; //进行反转
25
26 pPrev = pNode; //
27 pNode = pNode; //
28 }
29 return pReversedHead;
30 }