《剑指Offer》读书笔记--面试题16:反转链表

来源:互联网 发布:如何同意淘宝试用协议 编辑:程序博客网 时间:2024/05/29 08:10

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

链表结点定义:

struct ListNode{int m_nValue ;ListNode* m_pNext ;} ;

一开始我是先想到递归求解的:

ListNode* ReverseLinkedList(ListNode *pListHead) {if(NULL == pListHead){return NULL ;}else if(NULL == pListHead->m_pNext) //只有1个结点{return pListHead ;}ListNode *pNewHead = ReverseLinkedListCore(pListHead,NULL) ;return pNewHead ;}ListNode* ReverseLinkedListCore(ListNode *pCurNode,ListNode *pPrevNode) {if(NULL == pCurNode){return NULL ;}if(NULL == pCurNode->m_pNext)  //到最后一个结点了{pCurNode->m_pNext = pPrevNode ;  //开始逆转链表return pCurNode ;  //最后一个结点是新的头结点}else{ListNode *pNewHead = ReverseLinkedListCore(pCurNode->m_pNext,pCurNode) ;pCurNode->m_pNext = pPrevNode ;return pNewHead ;}}

而书上的解法是非递归的,更加直接和简洁:

ListNode* ReverseList(ListNode *pHead) {ListNode *pReversedHead = NULL ;ListNode *pNode = pHead ;ListNode *pPrev = NULL ;while(pNode != NULL){ListNode *pNext = pNode->m_pNext ;if(pNext == NULL) //只有一个结点{pReversedHead = pNode ;}pNode->m_pNext = pPrev ;pPrev = pNode ;pNode = pNext ;}return pReversedHead ;}




原创粉丝点击