【面试】链表反转
(a).a->b->...->h->i->j->...
(b).a<-b<-...<-h<-i j->...
注:(a).一个链表。(b).把 i 之前所有节点的 next 都指向前一个节点,导致链表在结点 i 、j 之间断裂。
不难注意到,由于结点 i 的next指向了它的前一个结点,导致我们无法在链表中遍历到结点 j 。为了避免链表在结点 i 处断开,我们需要在调整结点 i 的 next 之前,把结点 j 保存下来。
也就是说我们在调整结点 i 的 next 指针时,除了需要知道结点 i 本身之外,还需要 i 的前一个结点 h ,以为我们需要把结点 i 的 next 指向结点 h 。同时,我们还事先需要保存 i 的一个结点 j ,以防链表断开。因此相应地我们需要定义三个指针,分别指向当前遍历到的节点、它的前一个结点及后一个结点。
代码如下:
1 ListNode* ReverseList(ListNode* pHead) 2 { 3 ListNode* pReverseHead = NULL; 4 ListNode* pNode = pHead; 5 ListNode* pPre = NULL; 6 while(pNode != NULL) 7 { 8 ListNode* pNext = pNode->next; 9 10 if(pNext == NULL) 11 pReverseHead = pNode; 12 13 pNode->next = pPre; 14 15 pPre = pNode; 16 pNode = pNext; 17 } 18 19 return pReverseHead; 20 }