C++ 递归和非递归实现链表逆序

测试环境:vs2010  windows7

逆序分别采用递归调用和链表头插法实现逆序。

具体代码如下:

#include<iostream>
#include<stdlib.h>
using namespace std;

class LinkList
{
private:
	struct Node
	{
		struct Node *next;
		int value;
	};
	Node *phead;
	void reverse_use_recursion(Node *pnode)
	{
		if(pnode==nullptr||pnode->next==nullptr)
		{
			phead=pnode;
			return;
		}
		reverse_use_recursion(pnode->next);
		pnode->next->next=pnode;
		pnode->next=nullptr;
	}
public:
	LinkList()
	{
		phead=nullptr;

	}
	void initLinkList()
	{
		cout<<"初始化链表以-1结束"<<endl;
		int tmp;
		Node *ptmp;
		cin>>tmp;
		while(tmp!=-1)
		{
			if(phead==nullptr)
			{
				phead=new Node;
				phead->next=nullptr;
				phead->value=tmp;
				ptmp=phead;
			}else
			{
				ptmp->next=new Node;
				ptmp=ptmp->next;
				ptmp->value=tmp;
				ptmp->next=nullptr;
			}
			cin>>tmp;
		}
	}
	void print()
	{
		Node *pnode=phead;
		while(pnode!=nullptr)
		{
			cout<<pnode->value<<endl;
			pnode=pnode->next;
		}
	}
	void clear()
	{
		Node *pnode=phead;
		while(pnode!=nullptr)
		{
			Node *ptmp=pnode;
			pnode=pnode->next;
			delete ptmp;
		}
		phead=nullptr;
	}
	void reverse_recursion()//采用递归逆序
	{
		Node *pnode=phead;
		reverse_use_recursion(pnode);
	}
	void reverse_recycle()//采用链表的头插入法实现逆序
	{
		Node *pnode=phead;
		phead=nullptr;
		Node *ptmp;
		while(pnode!=nullptr)
		{
			if(phead==nullptr)
			{
				phead=pnode;
				ptmp=pnode;
				pnode=pnode->next;
				ptmp->next=nullptr;
			}
			else
			{
				ptmp=phead;
				phead=pnode;
				pnode=pnode->next;
				phead->next=ptmp;

			}

		}

	}
	~LinkList()
	{
		this->clear();
	}

};

int main()
{
	LinkList li;
	li.initLinkList();
	li.print();
	li.reverse_recycle();
	li.print();
	li.reverse_recursion();
	li.print();

	system("pause");
	return 0;
}

版权声明:欢迎转载,如有不足之处,恳请斧正。

时间: 2024-10-29 00:25:11

C++ 递归和非递归实现链表逆序的相关文章

链表反转的递归和非递归实现方式

链表反转是数据结构的基本功,主要有递归和非递归两种实现方式.我们一一介绍如下: 1. 非递归实现 主要包括如下4步: 1)如果head为空,或者只有head这一个节点,return head即可: 2)从头到尾遍历链表,把reversedHead赋值给当前节点的next: 3)当前节点赋值给reversedHead: 4)遍历结束,return reversedHead. 下图试图来辅助说明: 代码如下: node* reverseList(node* head) { if(head == NU

单链表的合并(递归、非递归)

递归方法将两个链表合并成一个链表 例:已知两个单链表head1和head2各自有序升序排列,请把他们合并成一个连表并依然有序,并保留原来所有节点 假设以下两个链表: 链表1:1->3->5 链表2:2->4->6 (1)比较1和链表2的第一个节点数据,由于1<2,因此把结果链表头结点指向链表1中的第一个节点,即数据1所在的节点 (2)对剩余的链表1(3->5)和链表2在调用本过程,比较得到结果链表的第二个节点,即2与3比较得到2,此时合并后的链表节点为1->2,这

JumpNode递归和非递归访问

JumpNode的定义结构为如下所示: struct JumpNode { int data; //存储数据 int order; // 记录访问次序,初始化均为0 JumpNode *jump, *next; // next为线性下一节点,jump为跳跃到下一节点 JumpNode(int d): data(d), order(-1), jump(NULL), next(NULL) {} }; 现在需要以递归和非递归的方式来访问到一个JumpNode *list.在访问的时候给各个节点的ord

简单迷宫算法(递归与非递归C++实现)

假定迷宫如下:1代表墙,0代表道路,起点在(1,1),终点(11,9)(PS:下标从0开始计算). 现在寻求一条路径能从起点到达终点(非最短). 有两种解法:递归与非递归. 递归算法思路: 要用递归,就要寻找一个子问题,该子问题是递归的.很明显,这道题的子问题就是从8个方向(上下左右还有四个斜角)中寻找一个可行方向并向前走一步,该子问题(seekPath函数)的实现代码如下: 1 struct offset{ 2 int x; 3 int y; 4 }; 5 offset move[8]={{-

全排列算法的递归与非递归实现

全排列算法的递归与非递归实现 全排列算法是常见的算法,用于求一个序列的全排列,本文使用C语言分别用递归与非递归两种方法实现,可以接受元素各不相同的输入序列. 题目来自leetcode: Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3

二叉树三种遍历递归及非递归实现(Java)

import java.util.Stack; //二叉树三种遍历递归及非递归实现(Java) public class Traverse { /******************定义二叉树**************************/ private final int MAX_SIZE = 10; //链式存储 public static class BinaryTreeNode { int mValue; BinaryTreeNode mLeft; BinaryTreeNode

归并排序(递归、非递归、以及自然归并排序)算法总结

注:本文所指归并排序指 二路归并排序. 归并排序是平均情况.最坏情况.最好情况时间复杂度都为O(Nlog2N)的稳定的排序算法.最近梳理了下归并排序的递归.非递归.以及自然归并排序算法. 归并排序的基础:将两个有序数组合并为一个有序数组,需要O(n)的辅助空间. 图片来自:https://www.cnblogs.com/chengxiao/p/6194356.html // array:待排序数组 //temparray: 临时数组 //startindex:起始下标 //middleindex

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi