不开辟新空间反转单链表(递归版本)
2017-07-09 17:52
281 查看
写的还是很坑的,今天状态奇差
测试:
ListNode* ReverseList(ListNode* pHead, ListNode*& pNewHead ) { if ( NULL == pHead ) return NULL; ListNode* pPrev = NULL; if ( NULL != pHead->m_pNext ) pPrev = ReverseList( pHead->m_pNext, pNewHead ); else//注意得保存下新的头 pNewHead = pHead; if ( NULL != pPrev )//注意递归第一次,pPrev为NULL,所以得加条件判断 pPrev->m_pNext = pHead; return pHead; }
测试:
#include <iostream>
using namespace std;
struct ListNode{
int m_nKey;
ListNode* m_pNext;
ListNode( ListNode* pNext, int value )
: m_pNext( pNext )
, m_nKey( value )
{}
};
void push_back( ListNode** pHead, int value );
ListNode* Find( ListNode* pListHead, int value );
ListNode* ReverseList(ListNode* pHead, ListNode*& pNewHead );
int main( )
{
ListNode* pHead = NULL;
//push_back( &pHead, 1 );
/*push_back( &pHead, 1 );
push_back( &pHead, 2 );*/
//push_back( &pHead, 1 );
//push_back( &pHead, 2 );
//push_back( &pHead, 3 );
//push_back( &pHead, 4 );
ListNode* pNewHead = NULL;
ReverseList( pHead, pNewHead );
if ( NULL != pHead ) //坑1
pHead->m_pNext = NULL;
while ( NULL != pNewHead ){
//坑2.小心别 NULL != pNewHead 这样会遗漏最后一个结点
cout << pNewHead->m_nKey << " ";
pNewHead = pNewHead->m_pNext;
}
cout << endl;
return 0;
}
void push_back( ListNode** pHead, int value )
{
if ( NULL == pHead )
return;
ListNode* pNewNode = new ListNode( NULL, value );
if ( NULL == *pHead ){
*pHead = pNewNode;
return;
}
ListNode* pNode = *pHead;
while ( NULL != pNode->m_pNext )
pNode = pNode->m_pNext;
pNode->m_pNext = pNewNode;
}
ListNode* Find( ListNode* pListHead, int value )
{
if ( NULL == pListHead )
return NULL;
ListNode* pNode = pListHead;
while ( NULL != pNode && value != pNode->m_nKey )
pNode = pNode->m_pNext;
if ( NULL == pNode )
return NULL;
return pNode;
}
ListNode* ReverseList(ListNode* pHead, ListNode*& pNewHead ) { if ( NULL == pHead ) return NULL; ListNode* pPrev = NULL; if ( NULL != pHead->m_pNext ) pPrev = ReverseList( pHead->m_pNext, pNewHead ); else//注意得保存下新的头 pNewHead = pHead; if ( NULL != pPrev )//注意递归第一次,pPrev为NULL,所以得加条件判断 pPrev->m_pNext = pHead; return pHead; }
相关文章推荐
- 合并两个有序的链表使新链表依然有序(不开辟新空间,在原链表上操作。 递归版本)
- 每日编程6之单链表反转递归版本
- 单链表的反转(非递归与递归版本)
- 用两种递归思路与循环实现单链表的反转
- 不开辟新空间,两个有序单链表合并为一个有序单链表
- 单链表反转的递归实现(Reversing a Linked List in Java, recursively)
- 单链表反转的递归实现(Reversing a Linked List in Java, recursively)
- 单链表反转(递归和非递归)
- 构建单链表的递归和非递归版本(C++版)
- 反转一个单链表的循环和递归实现
- 单链表的反转(用循环和递归实现单链表反转)
- 反转一个单链表的循环和递归实现
- 写代码,反转一个单链表,分别以迭代和递归的形式来实现
- 反转链表(在原链表进行操作,不开辟新空间. O(N)
- 反转一个单链表,迭代和递归实现
- 【链表】非递归过程以O(N)反转单链表
- 单链表的反转(非递归)
- 反转一个单链表,分别以迭代和递归的形式来实现
- 链表反转不开辟新空间
- [置顶] 单链表反转的递归与非递归实现