#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就地逆置,即利用原表各结点的空间实现逆置。 二、思路 在链表的第二个元素开始执行逆置,因为如果链...
- 前沿:链表是面试中经常问道的知识点,比如链表反转,就地反转,判断单链表是否相交,判断链表是否有环等都是常问的问题....