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

    执行结果:



  • 相关阅读:
    Sa提权sql语句大全
    转载 使用AJAX实现动态刷新页面功能
    VirtualBox宿主机与虚拟机的数据共享数据空间
    SP_OACreate提权经验
    linux mysql启动错误
    Microsoft SQL Server SA权限最新入侵方法 不用net user添加账户
    Java中关于HashMap的使用和遍历
    转载 突破360防黑加固添加用户
    个人随想BLOG
    面试题收集
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4057968.html
Copyright © 2011-2022 走看看