zoukankan      html  css  js  c++  java
  • 两种方法求单链表逆序

    1 递归,非常easy

    代码:

    #include<iostream>  
    
    using namespace std;  
    
    typedef struct node{
    	int data;
    	struct node * pNext;
    }Node ,*pNode;
    
    void createNode(pNode & pHead){
    	int temp;
    	scanf("%d",&temp);
    	pNode p,q;
    	bool isFirst = true;
    	while(temp){
    		if(isFirst){
    			p=q=pHead=(pNode)malloc(sizeof(Node));
    			pHead->data = temp;
    			isFirst = false;
    		}else{
    			q = new Node();
    			q->data = temp;
    			q->pNext=NULL;
    			p->pNext = q;
    			p =q;
    		}
    		scanf("%d",&temp);
    	}
    
    }
    void print(pNode pHead){
    	if(pHead){
    		cout<<pHead->data<<" ";
    		print(pHead->pNext);
    	}else
    	return;		
    }
    
    void reverse(pNode pcur,pNode & pHead){
    	if((NULL == pcur) ||( NULL == pcur->pNext)){
    			pHead = pcur;
    			return;
    	}else{
    		pNode pnext = pcur->pNext;
    		reverse(pnext,pHead);
    		pnext->pNext = pcur;
    		pcur->pNext = NULL;
    	}
    }
    int main()  
    {  
    	pNode pHead = NULL;
    	createNode(pHead);
    	cout<<"原链表:"<<endl;
    	print(pHead);
    	cout<<"翻转:"<<endl;
    	reverse(pHead,pHead);
    	print(pHead);
        return 0;  
    }  

    执行结果:


    2 不是递归,循环:

    #include<iostream>  
    
    using namespace std;  
    
    typedef struct node{
    	int data;
    	struct node * pNext;
    }Node ,*pNode;
    
    void createNode(pNode & pHead){
    	int temp;
    	scanf("%d",&temp);
    	pNode p,q;
    	bool isFirst = true;
    	while(temp){
    		if(isFirst){
    			p=q=pHead=(pNode)malloc(sizeof(Node));
    			pHead->data = temp;
    			isFirst = false;
    		}else{
    			q = new Node();
    			q->data = temp;
    			q->pNext=NULL;
    			p->pNext = q;
    			p =q;
    		}
    		scanf("%d",&temp);
    	}
    
    }
    void print(pNode pHead){
    	if(pHead){
    		cout<<pHead->data<<" ";
    		print(pHead->pNext);
    	}else
    	return;		
    }
    
    pNode reverse(pNode & pHead){
    	if(NULL == pHead || NULL == pHead->pNext){
    		return pHead;
    	}
    	pNode p1,p2,p3;
    	p1=pHead;
    	p2=pHead->pNext;
    	while(p2){
    		p3=p2->pNext;
    		p2->pNext = p1;
    		p1 = p2;
    		p2 = p3;
    	}
    	pHead->pNext = NULL; /*设置链表尾*/
    	pHead = p1;  /*调整链表头*/
    	return pHead;
    }
    int main()  
    {  
    	pNode pHead = NULL;
    	createNode(pHead);
    	cout<<"原链表:"<<endl;
    	print(pHead);
    	cout<<"翻转:"<<endl;
    	reverse(pHead);
    	print(pHead);
        return 0;  
    }  

    执行结果:



  • 相关阅读:
    最全最新java面试题系列全家桶(带答案)
    [多平台]pymo – 手机上的 GalGame 引擎
    Hyperledger Fabric-sdk-java
    Nginx、OpenResty和Kong的基本概念与使用方法
    nginx代理 tomcat获得真实用户IP
    nodejs+gulp+webpack基础知识
    开始写下自己的python的cocos2d, pyglet学习
    机器学习算法GBDT的面试要点总结-上篇
    Python 最常见的 170 道面试题解析:2019 最新
    VCL消息处理机制
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4057968.html
Copyright © 2011-2022 走看看