剑指offer--从尾到头打印链表

记录来自《剑指offer》的算法题目
链表应该是面试时被提及最频繁的数据结构,它的结构简单,由若干个结点连接成链状结构,其创建、插入结点、删除结点等操作都只需要20行左右的代码就能实现,其代码量比较适合面试。

假设单链表的结点定义如下:

struct ListNode{int m_nValue;ListNode* m_pNext;
};

往链表的末尾添加一个结点的代码如下:

// 在链表结尾插入一个结点
void AddToTail(ListNode** pHead, int value){ListNode* pNew = new ListNode();pNew->m_nValue = value;pNew->m_pNext = NULL;if (*pHead == NULL){*pHead = pNew;}else{ListNode* pNode = *pHead;while (pNode->m_pNext != NULL)pNode = pNode->m_pNext;pNode->m_pNext = pNew;}
}

这里第一个参数pHead是一个指向指针的指针,因为在往一个空链表插入一个结点时,这个结点就是链表的头指针,也就是会改动头指针,因此必须把pHead参数设为指向指针的指针,否则出了这个函数pHead仍然是空指针。其测试代码如下:

int main(void){ListNode* t = NULL;for (int i = 0; i < 10;i++)AddToTail(&t, i);return 0;
}

删除某个结点的代码如下:

// 删除给定数值的结点
void RemoveNode(ListNode** pHead, int value){if (pHead == NULL || *pHead == NULL)return;ListNode* pToBeDeleted = NULL;if ((*pHead)->m_nValue == value){pToBeDeleted = *pHead;*pHead = (*pHead)->m_pNext;}else{ListNode* pNode = *pHead;while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)pNode = pNode->m_pNext;if (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value){pToBeDeleted = pNode->m_pNext;pNode->m_pNext = pNode->m_pNext->m_pNext;}}if (pToBeDeleted != NULL){delete pToBeDeleted;pToBeDeleted = NULL;}
}

下面是这道算法题的题目:

输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

这里假设不能修改链表的结构,首先肯定是需要遍历整个链表,遍历也是从头到尾的顺序,但输出顺序却是从尾到头,所以这里可以使用栈来进行辅助。因此,实现代码如下:

// 从尾到头打印链表,迭代输出
void PrintListReversingly_Iteratively(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();cout<<pNode->m_nValue<<" ";nodes.pop();}cout << endl;
}

这里既然想到使用栈来实现函数,而递归本质上就是一个栈结构,所以自然想到可以用递归来实现。实现代码如下:

// 递归版本
void PrintListReversingly_Recursively(ListNode* pHead){if (pHead != NULL){if (pHead->m_pNext != NULL){PrintListReversingly_Recursively(pHead->m_pNext);}cout << pHead->m_nValue << " ";}
}

更完整的代码例子可以查看从尾到头打印链表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java序列化表单同步请求_Ajax serialize() 表单进行序列化方式上传文件

通过传统的 form 表单提交的方式上传文件上传文件&#xff1a;不过传统的 form 表单提交会导致页面刷新&#xff0c;但是在有些情况下&#xff0c;我们不希望页面被刷新&#xff0c;这种时候我们都是使用 Ajax 的方式进行请求的。使用 serialize() 对 form 表单进行序列化提交$…

Linux下Nginx的安装和简单管理

nginx下载 http://nginx.org/download/ http://www.2cto.com/os/201206/136381.html转载于:https://www.cnblogs.com/jphp/archive/2013/04/01/2993403.html

谈 数学之美 和 看见

两本书本来是没有什么交集的。 而对于我而言,交集可能是我最近这两本书都买了。闲暇的时间还是会翻一翻的。看见这本书是今天中午到的。发现现在的当当比以前在书的保养上比以前好像好了一点。几本书都是给包住了,防止弄坏了拐角。 两本书我都很喜欢,今天到的书也是立刻就读了起…

剑指offer--用两个栈实现队列

记录《剑指offer》上的算法题。 题目描述如下&#xff1a; 用两个栈实现一个队列&#xff0c;队列的声明如下&#xff0c;请实现它的两个函数appendTail和deleteHead&#xff0c;分别完成在队列尾部插入结点和在队列头部删除结点的功能。 队列的声明如下&#xff1a; templat…

剑指offer--旋转数组的最小数字

记录来自《剑指offer》上的算法题。 题目描述如下&#xff1a; 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个选择&#xff0c;输出旋转数组的最小元素。例如数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转&#xff0…

python 合并excel 自动更新_手把手教你4种方法用Python批量实现多Excel多Sheet合并

一、前言大家好&#xff0c;我是崔艳飞。前两天给大家分享了Python自动化文章&#xff1a;手把手教你利用Python轻松拆分Excel为多个CSV文件&#xff0c;而后在Python进阶交流群里边有读者遇到一个问题&#xff0c;他有很多个Excel表格&#xff0c;他需要对这些Excel文件进行合…

jQuery布局插件UI Layout简介

UI Layout是一种基于jQuery的布局框架&#xff0c;项目主页http://layout.jquery-dev.net/。该框架的参考原型是ExtJS的border-layout&#xff0c;因此十分适用于将原有使用ExtJS的项目改造成jQuery项目。其核心是一个大小自适应的中心面板&#xff08;必选&#xff09;&#x…

淘到了一个不错的TF卡读卡器

最近换手机的时候一时冲动败了个32G的TF卡。买后又觉得手机存储空间还比较充裕&#xff0c;暂时用不上&#xff0c;便打算套个读卡器当U盘用。最开始我用的是以前买手机的时候送的一个读卡器&#xff0c;但其兼容性很差&#xff0c;在以前的那个8G的卡里还能勉强用用&#xff0…

剑指offer--斐波那契数列

记录来自《剑指offer》的算法题。 题目如下&#xff1a; 写一个函数&#xff0c;输入n&#xff0c;实现斐波那契数列的第n项。 斐波那契数列的定义如下&#xff1a; f(n)⎧⎩⎨01f(n−1)f(n−2)n0n1n>1f(n) = \begin{cases} 0 & n=0 \\ 1 & n=1 \\ f(n-1) + f(n-2…

java jdbc6_Java学习-JDBC

JDBC1、数据库驱动应用程序通过驱动连接到数据库&#xff0c;进而操作数据库。2、JDBC简化开发人员对数据库的操作&#xff0c;提供了一个java操作数据库的规范&#xff0c;俗称JDBC对于程序猿&#xff0c;只需要学习JDBC提供的接口。java.sqljavax.sqlpublic class DemoJdbc01…

Unity3D For Android 开发教程【转http://game.ceeger.com/Unity/Doc/2011/Unity3D_For_Android.html】...

Unity3D For Android 开发教程 Date:2011-08-01 04:33我自认为抵挡诱惑的能力还是很强大的&#xff0c;关键的时候还能把持住自己。今天逛了一下南京的丹凤街&#xff0c;终于受不住Android这美眉的诱惑。她虽脸蛋不怎么滴&#xff0c;但身材火热&#xff0c;且性感&#xff0c…

剑指offer--二进制中1的个数

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中1的个数。例如把9表示成二进制是1001&#xff0c;有两位是1&#xff0c;因此如果输入9&#xff0c;函数输出是2。 这道题目的一个基本思路是…

CentOS 6.4 编译安装 gcc-4.8.0

1.首先下载源代码 wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.0/gcc-4.8.0.tar.bz22.解压 tar -jxvf gcc-4.8.0.tar.bz23.下载编译所需的依赖项 cd gcc-4.8.0  ./contrib/download_prerequisites  cd ..4.建立编译输出目录 mkdir gcc-build-4.8.05.进入此目录&#xff0c;执…

剑指offer--数值的整数次方

记录来自《剑指offer》上的算法题。 题目描述&#xff1a; 实现函数 double Power(double base, int exponent), 求 base的 exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。 下面是一种解法&#xff1a; // 判断num1是否等于num2 bool equal(double num1,…