单链表的反转

#include "stdafx.h"

#include <Windows.h>

ListNode* InitList();
void DisplayList(ListNode* phead);

//递归反转
ListNode* ReverseList(ListNode* oldList, ListNode*& newHead);
//非递归反转
ListNode* ReverseList2(ListNode *root);

int main()
{
	ListNode* phead = InitList();


	DisplayList(phead);

	ListNode* pNewLst = NULL;
	//ReverseList(phead, pNewLst);
	pNewLst = ReverseList2(phead);
	DisplayList(pNewLst);


	return 0;
}

void DisplayList(ListNode* phead)
{
	ListNode* ptmp = phead;
	while(ptmp!=NULL)
	{
		printf("%d\n", ptmp->data);
		ptmp = ptmp->next;
	}

}

ListNode* InitList()
{
	ListNode* pnode = NULL;
	ListNode* pCur = NULL;
	ListNode* phead =NULL;
	for (int i=0; i<10;i++)
	{
		pnode = new ListNode();
		memset(pnode, 0, sizeof(ListNode));
		pnode->data = i;
		if (NULL == pCur)
		{
			pCur = pnode;
			phead = pCur;
		}
		else
		{
			pCur->next = pnode;
			pCur = pCur->next;
		}
	}
	return phead;
}

ListNode* ReverseList(ListNode* oldList, ListNode*& newHead)
{
	if (NULL == oldList
		||oldList->next == NULL)
	{
		newHead = oldList;
		return newHead;
	}

	ReverseList(oldList->next, newHead);
	
	oldList->next->next = oldList;
	oldList->next = NULL;

	return newHead;
}


ListNode* ReverseList2(ListNode *root)
{
	ListNode* oldRoot = root;
	if (root == NULL || root->next == NULL)
		return root;

	ListNode* pCur = root->next;
	while(pCur!=NULL)
	{
		ListNode* pNext = pCur->next;
		pCur->next = root;
		root = pCur;
		pCur = pNext;
	}
	oldRoot->next = NULL;
	return root;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值