#include<stdio.h>
struct ListNode
{
int m_data;
struct ListNode * m_pNext;
};
// pPrve pNode pNext
// 正常实现
ListNode* ReverseList(ListNode *pHead)
{
ListNode* pNode = pHead;
ListNode* pReversedHead = NULL;
ListNode* pPrev = NULL;
while(NULL!=pNode)
{
ListNode* pNext = pNode->m_pNext;
if(NULL == pNext)
pReversedHead = pNode;
pNode->m_pNext = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReversedHead;
}
//递归实现
ListNode* ReverseSingle(ListNode*pNode, ListNode* pPrev)
{
if(NULL == pNode)
{
return pPrev;
}
ListNode *pNext = pNode-> m_pNext;
pNode->m_pNext = pPrev;
return ReverseSingle(pNext, pNode);
}
ListNode* ReversedListRecursive(ListNode *pHead)
{
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
return ReverseSingle(pNode,pPrev);
}
//打印
void printList(ListNode* pHead)
{
//应加判断pHead不为空
ListNode* ptemp = pHead;
while(ptemp != NULL)
{
printf("%d ",ptemp->m_data);
ptemp = ptemp->m_pNext;
}
putchar('\n');
}
int main(int argc, char**argv)
{
int len =10;
ListNode* pHead = new ListNode;
pHead->m_data = 10;
pHead->m_pNext = NULL;
ListNode* pPrev = pHead;
for(int i=0;i<len;++i)
{
ListNode* p = new ListNode;
p->m_data = i;
p->m_pNext = pPrev->m_pNext;
pPrev -> m_pNext = p;
}
printList(pHead);
//ListNode* pReversedHead = ReversedListRecursive(pHead);
ListNode* pReversedHead = ReverseList(pHead);
printList(pReversedHead);
}
链表的逆置(又称反转)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 一、题目 将链表L就地逆置,即利用原表各结点的空间实现逆置。 二、思路 在链表的第二个元素开始执行逆置,因为如果链...
- 前沿:链表是面试中经常问道的知识点,比如链表反转,就地反转,判断单链表是否相交,判断链表是否有环等都是常问的问题....