zoukankan      html  css  js  c++  java
  • 从尾到头打印一个链表

    这样的链表问题时不时的出现,你有没有特定的方法去处理呢:以下给出你可能用到的算法:

    第一种:改变链表的结构

    思想:

    1.从尾到头打印链表,那就逆置链表呗

    2.打印逆置后的链表;

    这个简单,直接上代码:

    void PrintListRevers(ListNode* pHead)
    {
    	//1.链表逆置
    	ListNode* newHead = NULL;
    	ListNode* cur = pHead;
    	while (cur)
    	{
    		ListNode* tmp = cur;
    		cur = cur->m_pNext;
    		tmp->m_pNext = newHead;
    		newHead = tmp;
    	}
    
    	//2.打印逆置链表
    	ListNode* tmp = newHead;
    	while (tmp)
    	{
    		cout << tmp->m_nValue << " ";
    	}
    	cout << endl;
    }
    很简单,但是,很不辛的改变了链表原来的结构 这是一种只做读操作不应该出现的,所以,有下边的算法;

    方法二:借用栈

    思想:

    1.由于是从尾部开始打印,如果我们是从头开始遍历,那么先遍历的后打印,这正好的栈的特点。

    2.遍历完了之后,所有节点入栈,之后出栈打印。

    于是,下边简单的代码又出来了:

    void PrintListRevers(ListNode* pHead)
    {
        std::stack<ListNode*> nodes;
    
        ListNode* pNode = pHead;
        while(pNode != NULL)
        {
            nodes.push(pNode);
            pNode = pNode->m_pNext;
        }
    
        while(!nodes.empty())
        {
            pNode = nodes.top();
            printf("%d	", pNode->m_nValue);
            nodes.pop();
        }
    }
    方法三:递归

    思想:

    1.递归就是用栈的思想,既然能想到栈,递归也就想到了

    代码:

    void PrintListRevers(ListNode* pHead)
    {
        if(pHead != NULL)
        {
            if (pHead->m_pNext != NULL)
            {
                PrintListRevers(pHead->m_pNext);
            }
     
    		//printf很好控制打印格式
            printf("%d	", pHead->m_nValue);
        }
    }
    但是,递归的缺点很明显,如果连边过长,就会造成栈溢出等问题,谨慎使用!


    赐教.



  • 相关阅读:
    (Vue中)cehart在同一个dom上画图图切换时饼图有折线图的坐标系
    linux(centos7)修改服务器时间
    centos6 yum源不能使用
    Linux 使用 history 来减少重复命令的几个实用技巧。
    7个Shell 拿来就用脚本实例!
    keepalived的配置解析&安装与爬坑
    linux最全命令使用手册
    linux各种误删文件恢复方法(经典强推)
    位运算符
    SQL 书写、执行顺序
  • 原文地址:https://www.cnblogs.com/melons/p/5791856.html
Copyright © 2011-2022 走看看