剑指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 };