C++ 链表的递归逆转和循环逆转

本文介绍了一种链表数据结构的实现方式,并提供了添加元素到链表末尾的方法。此外,还展示了两种不同的链表遍历方法:递归与非递归方式。更重要的是,详细解释了如何使用递归方法来反转链表,并通过示例代码演示了整个过程。

算法比较菜,没算法天赋呀。。。得多写。。。  

struct node {
	int a;
	node * pnext;
} ;

void addlist(node * phead,int a)
{
	if(phead == NULL)
		return ;
	while (phead->pnext != NULL)
	{
		phead = phead ->pnext ;
	}
	node * p = new node;
	p->a = a;
	p->pnext = NULL ;
	phead->pnext = p;
}

void DisplayListRecursive(node * phead)
{
	if(phead == NULL   )
		return ;
	DisplayListRecursive(phead->pnext);
	printf("%d \n",phead->a);
}

void DisplayList(node * phead)
{
	if(phead == NULL)
		return ;
	while(phead != NULL)
	{
		printf("%d \n",phead->a);
		phead = phead->pnext ;
	}
}

node * RecursiveList(node * phead)
{
	node * p1,*p2,*p3 ;

	if(phead==NULL)
		return NULL;

	if(phead->pnext == NULL)
		return phead ;

	p1 = phead;
	p2 = p1->pnext ;
	p3 = p2->pnext ;
	phead->pnext = NULL ;

	while(p3 != NULL)
	{
		p2->pnext = p1 ;
		p1 = p2 ;
		p2 = p3 ;
		p3 = p3->pnext ;
	}
	p2->pnext = p1;
	return p2 ;
}

node * RecursiveListE(node * phead)
{
	if(phead == NULL || phead->pnext == NULL )
		return phead ;
	else
	{
		node * pnewhead = RecursiveListE(phead->pnext ) ; 
		phead->pnext->pnext = phead ;
		phead->pnext = NULL ;
		return pnewhead ;
	}
}
int main(int argc, char* argv[])
{
	node * head = new node;
	head->a = 0 ;
	head->pnext = NULL;
	addlist(head,1);
	addlist(head,2);
	addlist(head,3);
	addlist(head,4);
	DisplayList(RecursiveListE(head));
	return 0;
}


C++实现链表逆转有多种方法,以下为你介绍常见的几种: ### 递归递归法的思路是先递归反转剩余部分链表,再将当前节点加入到反转后链表的末尾。以下是示例代码: ```cpp #include <iostream> // 定义链表节点结构 typedef struct Node { int data; struct Node* next; } Node; // 递归反转链表 Node* reverseLinkedList(Node* head) { // 空链表或只有一个节点,直接返回 if (head == NULL || head->next == NULL) { return head; } // 递归反转剩余部分链表 Node* newHead = reverseLinkedList(head->next); // 将当前节点加入到反转后链表的末尾 head->next->next = head; // 当前节点成为新的末尾节点 head->next = NULL; return newHead; } // 打印链表 void printLinkedList(Node* head) { while (head != NULL) { std::cout << head->data << " "; head = head->next; } std::cout << std::endl; } int main() { // 构建一个链表:1 -> 2 -> 3 -> 4 -> 5 Node* head = NULL; for (int i = 5; i >= 1; i--) { Node* newNode = new Node; newNode->data = i; newNode->next = head; head = newNode; } std::cout << "原始链表:"; printLinkedList(head); head = reverseLinkedList(head); std::cout << "逆转链表:"; printLinkedList(head); return 0; } ``` 此方法先判断链表是否为空或只有一个节点,若是则直接返回。接着递归反转剩余部分链表,再调整当前节点的指向,最后返回新的头节点[^2]。 ### 迭代法 迭代法通过三个指针 `beg`、`mid` `end` 来遍历链表并修改节点的指向。示例代码如下: ```cpp #include <iostream> // 定义链表节点结构 struct link { int data; link* next; link(int val) : data(val), next(nullptr) {} }; // 迭代反转链表 link* reverse(link* head) { if (head == nullptr || head->next == nullptr) return head; link* beg = nullptr; link* mid = head; link* end = head->next; // 遍历 while (true) { // 修改mid所指节点的指向beg mid->next = beg; // 判断end是否最后了 if (end == nullptr) break; // 调整向后移动 beg = mid; mid = end; end = end->next; } // 修改head头指针的指向 head = mid; return head; } // 打印链表 void printLinkedList(link* head) { while (head != nullptr) { std::cout << head->data << " "; head = head->next; } std::cout << std::endl; } int main() { // 构建一个链表:1 -> 2 -> 3 -> 4 -> 5 link* head = new link(1); link* current = head; for (int i = 2; i <= 5; i++) { current->next = new link(i); current = current->next; } std::cout << "原始链表:"; printLinkedList(head); head = reverse(head); std::cout << "逆转链表:"; printLinkedList(head); return 0; } ``` 该方法使用三个指针遍历链表,不断修改节点的指向,最后调整头指针的指向完成反转[^3]。 ### 双向链表逆序输出法 对于双向链表,创建好之后选择逆序方式进行输出即可。示例代码如下: ```cpp #include <iostream> // 定义双向链表节点结构 struct node { int data; node* before; node* next; node(int val) : data(val), before(nullptr), next(nullptr) {} }; // 逆序输出双向链表 void print(node*& end) { for (node* p = end; p->before; p = p->before) { std::cout << p->data << " "; } std::cout << std::endl; } int main() { // 构建一个双向链表:1 <-> 2 <-> 3 <-> 4 <-> 5 node* head = new node(1); node* current = head; node* end = nullptr; for (int i = 2; i <= 5; i++) { node* newNode = new node(i); current->next = newNode; newNode->before = current; current = newNode; if (i == 5) { end = newNode; } } std::cout << "逆序输出双向链表:"; print(end); return 0; } ``` 该方法适用于双向链表,通过逆序遍历双向链表实现反转输出[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值