码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer-反转链表

时间:2018-04-07 21:10:41      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:访问   pre   tno   solution   esc   nod   color   节点   turn   

题目描述

 

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

代码思路

 

  要反转链表即要把每个节点的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 };

 

剑指offer-反转链表

标签:访问   pre   tno   solution   esc   nod   color   节点   turn   

原文地址:https://www.cnblogs.com/wmx24/p/8734468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!