剑指offer-反转链表

题目描述

 

  输入一个链表,反转链表后,输出链表的所有元素。
 

代码思路

 

  要反转链表即要把每个节点的next指针反转,考虑下面的链表:

1 -> 2 -> 3 -> 4

  第一次反转时若把2的next指针直接指向1,则会出现下列情况:

1 <- 2   3 -> 4

  接下来再往下便访问不到3于是无法完成反转。所以完成当前反转之前,要先保存当前结点的下一个节点。具体来说可以设置三个指针来实现:pPre指向要调整next指针的前一个节点,pHead为当前要反转的节点,pAfter为pHead的下一个节点。操作如下:

 

 1    <-   2        3   ->   4
pPre     pHead    pAfter

 

  这样每次反转前,先保存当前结点的下一个节点,然后调整当前结点的next指针使其指向pPre,这样遍历下去直到pAfter为NULL,此时已反转完整个链表,并且pHead也指向了原链表的末尾也就是新链表的头结点。

  注意在反转前要判断pPre是否为NULL,如果为NULL说明是第一次反转,那么需要把当前结点也就是链表头结点的next指针指向NULL。

 

 

代码

 

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* ReverseList(ListNode* pHead) {
12         if(pHead == NULL)
13             return NULL;
14         ListNode* pPre = NULL;
15         ListNode* pAfter = NULL;
16         if(pHead->next)
17             pAfter = pHead->next;
18         while(pAfter){
19             if(pPre == NULL)
20                 pHead->next = NULL;
21             pPre = pHead;
22             pHead = pAfter;
23             pAfter = pHead->next;
24             pHead->next = pPre;
25         }
26         return pHead;
27     }
28 };

 

posted @ 2018-04-07 19:56  FlyingWarrior  阅读(249)  评论(0编辑  收藏  举报