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;  
    }  

    执行结果:



  • 相关阅读:
    RMAN备份脚本
    配置putty隧道登录远程window远程或远程数据库
    ssh登录报错:no common kex alg
    Solaris上修改进程能够打开的最大文件句柄数
    如何在V890上安装配置rsc(转)
    Oracle表或分区导出脚本
    检查日期合法性脚本(转)
    Solaris下常用的磁带操作命令
    如何从solaris操作系统上获取机器的sn号
    如何修复failed磁盘和"DISABLED RECOVER"状态的plex
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4057968.html
Copyright © 2011-2022 走看看