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

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

链表结点定义:

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 ;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值