数据结构基础篇-链表反转(非递归与递归)C++实现

链表反转C++代码,附加打印逆序链表(不进行反转)代码。

 

测试用例:

5
2 3 4 10 5
1
4

 

1.非递归实现

思路:需要三个指针p1、p2、p3,分别指向上一个节点、当前节点与缓存的下一个节点,每次循环执行操作:

(----表示为连接,<—表示左连接,xx表示未使用指针)

缓存与反转:p1<—p2----p3

指针右移:   xx-----p1----p2

代码:(核心代码为34~45行)

//链表反转-非递归
#include
using namespace std;

struct Node
{
	int value;
	Node* next;
};

int main()
{
	int n;	//链表节点个数
	while (cin>>n)
	{
		if (n <= 0) { continue; }

		//链表创建
		Node* head = new Node;
		cin >> head->value;
		head->next = nullptr;
		Node* p = head;
		for (int i = 1; i < n; i++)
		{
			Node* tmp = new Node;
			cin >> tmp->value;
			tmp->next = nullptr;
			
			p->next = tmp;
			p = p -> next;
		}

		//链表反转-非递归
		Node* p1 = nullptr;	//上一个节点的指针
		Node* p2 = head;	//当前节点的指针
		Node* p3 = nullptr;	//用于缓存下一个节点的指针

		while (p2!=nullptr)
		{
			p3 = p2->next;	//暂存下一个节点的指针
			p2->next = p1;	//反转
			p1 = p2;	//上一节点指针右移
			p2 = p3;	//当前节点指针右移
		}
		head = p1;	//反转后的链表头指针为最后一个非NULL节点的指针

		//打印
		p = head;
		while (p!=nullptr&&p->next!=nullptr)
		{
			cout << p->value << " ";
			p = p->next;
		}
		cout << p->value << endl;

		//内存释放
		delete head, p, p1, p2, p3;
		head = p = p1 = p2 = p3 = nullptr;
	}
	return 0;
}

 

2.递归实现

思路:三个指针pLast、pHead、pTmp,作用对应非递归的p1、p2、p3;定义反转子函数:

Node* ReverseList(Node* pLast, Node* pHead)

子函数操作与非递归类似;返回值为反转后的链表头节点指针。

 

代码:(42行调用ReverseList子函数)

//链表反转-递归
#include
using namespace std;

struct Node
{
	int value;
	Node* next;
};

Node* ReverseList(Node* pLast, Node* pHead)
{
	Node* pTmp = pHead->next;
	pHead->next = pLast;
	if (pTmp == nullptr) { return pHead; }
	return ReverseList(pHead, pTmp);
}

int main()
{
	int n;	//链表节点个数
	while (cin>>n)
	{
		if (n <= 0) { continue; }

		//链表创建
		Node* head = new Node;
		cin >> head->value;
		head->next = nullptr;
		Node* p = head;
		for (int i = 1; i < n; i++)
		{
			Node* tmp = new Node;
			cin >> tmp->value;
			tmp->next = nullptr;
			
			p->next = tmp;
			p = p -> next;
		}

		//链表反转-递归
		head = ReverseList(nullptr, head);

		//打印
		p = head;
		while (p!=nullptr&&p->next!=nullptr)
		{
			cout << p->value << " ";
			p = p->next;
		}
		cout << p->value << endl;

		//内存释放
		delete head, p;
		head = p = nullptr;
	}
	return 0;
}

 

3.衍生:打印逆序链表,不进行反转操作(递归)

//打印逆序链表,不反转-递归
#include
using namespace std;

struct Node
{
	int value;
	Node* next;
};

void ReversePrint(Node* pHead)
{
	if((pHead->next)!=nullptr)
	{
		ReversePrint(pHead->next);
		cout << " ";
	}
	cout << pHead->value;
}

int main()
{
	int n;	//链表节点个数
	while (cin>>n)
	{
		if (n <= 0) { continue; }

		//链表创建
		Node* head = new Node;
		cin >> head->value;
		head->next = nullptr;
		Node* p = head;
		for (int i = 1; i < n; i++)
		{
			Node* tmp = new Node;
			cin >> tmp->value;
			tmp->next = nullptr;
			
			p->next = tmp;
			p = p -> next;
		}

		//打印逆序链表(不进行反转操作)-递归
		ReversePrint(head);
		cout << endl;	//手动换行

		//内存释放
		delete head, p;
		head = p = nullptr;
	}
	return 0;
}

 

你可能感兴趣的:(数据结构)