• 递归和非递归实现链表反转


    链表反转是面试笔试常考题目,直接贴代码。

    反转函数如下:

    //思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面
    ListNode * ReverseList(ListNode *  head)
    {
       //如果链表为空或者链表中只有一个元素
       if(head==NULL || head->m_pNext==NULL)
    	   return head;
       ListNode * p=head->m_pNext;
       ListNode * q=head;
       while(p!=NULL)
       {
         q->m_pNext=p->m_pNext;//记录下p的下一个节点
    	 p->m_pNext=head;
    	 head=p;
    	 p=q->m_pNext;//准备将p的下一个节点放到表头
       }
       return head;
    }
    
    //递归方式
    ListNode * ReverseList2(ListNode * head)
    {
    	//如果链表为空或者链表中只有一个元素
    	if(head==NULL || head->m_pNext==NULL)
    		return head;
    	else
    	{
    	   ListNode * newhead=ReverseList2(head->m_pNext);//先反转后面的链表
    	   head->m_pNext->m_pNext=head;//再将当前节点设置为其然来后面节点的后续节点
    	   head->m_pNext=NULL;
    	   return newhead;
    	}
    }


    整体测试代码如下:

    // 反转链表.cpp : 定义控制台应用程序的入口点。
    #include "stdafx.h"
    #include  <iostream>
    using namespace std;
    
    //定义一个链表节点
     typedef struct ListNode
    {
    	int       m_nKey;
    	struct ListNode * m_pNext;
    }ListNode;
    
    //插入一个新节点到链表中(放在链表头部)
    void CreateList(ListNode * & head,int data)
    {
    	//创建新节点
        ListNode * p=(ListNode*)malloc(sizeof(ListNode));
    	p->m_nKey=data;
    	p->m_pNext=NULL;
    
    	if(head==NULL)
    	{
    		head=p;
    		return;
    	}
    	p->m_pNext=head;
    	head=p;
    }
    
    void  printList(ListNode* head)
    {
       ListNode * p=head;
       while(p!=NULL)
       {
          cout<<p->m_nKey<<" ";
    	  p=p->m_pNext;
       }
       cout<<endl;
    }
    
    //思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面
    ListNode * ReverseList(ListNode *  head)
    {
       //如果链表为空或者链表中只有一个元素
       if(head==NULL || head->m_pNext==NULL)
    	   return head;
       ListNode * p=head->m_pNext;
       ListNode * q=head;
       while(p!=NULL)
       {
         q->m_pNext=p->m_pNext;//记录下p的下一个节点
    	 p->m_pNext=head;
    	 head=p;
    	 p=q->m_pNext;//准备将p的下一个节点放到表头
       }
       return head;
    }
    
    //递归方式
    ListNode * ReverseList2(ListNode * head)
    {
    	//如果链表为空或者链表中只有一个元素
    	if(head==NULL || head->m_pNext==NULL)
    		return head;
    	else
    	{
    	   ListNode * newhead=ReverseList2(head->m_pNext);//先反转后面的链表
    	   head->m_pNext->m_pNext=head;//再将当前节点设置为其然来后面节点的后续节点
    	   head->m_pNext=NULL;
    	   return newhead;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	ListNode * Head=NULL;
        for(int i=0;i<10;i++)
          CreateList(Head,i);
        printList(Head);
        Head=ReverseList(Head);
        printList(Head);
    	system("PAUSE");
    	return 0;
    }
    


    运行结果如下:


  • 相关阅读:
    Neo4j图形数据库备份
    Linux中Tomcat 自动设置CATALINA_HOME方法
    VNC viewer 无法打开oracle 11g图形界面方案
    CYPHER 语句(Neo4j)
    Tomcat部署时war和war exploded区别
    java中不能使用小数点(.)来作为分隔符
    做一个完整的Java Web项目需要掌握的技能
    从零讲Java,给你一条清晰地学习道路!该学什么就学什么!
    MYSQL数据库表排序规则不一致导致联表查询,索引不起作用问题
    chrome浏览器的跨域设置——包括版本49前后两种设置
  • 原文地址:https://www.cnblogs.com/riskyer/p/3283634.html
Copyright © 2020-2023  润新知