剑指offer 6:链表(从头到尾打印链表)
链表的数据结构
struct ListNode
{
int value;
ListNode* next;
};
那么在链表的末尾添加一个节点的代码如下:
void insert(ListNode** pHead, int value)
{
ListNode* pNew = new ListNode;
pNew->value = value;
pNew->next = NULL;
if (*pHead == NULL)
{
*pHead = pNew;
}
else
{
ListNode* temp = *pHead;
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = pNew;
}
}
在上面的代码中,我们要特别注意函数的第一个参数是pHead是一个指向指针的指针。当我们往一个空链表中插入一个节点时,新插入的节点就是链表的头指针。由于此时会改动头指针,因此必须把pHead参数设为指向指针的指针,否则出了这个函数pHead仍然是一个空指针。
这这里指针的指针可以这样理解——pHead是一个指向指针的指针,*pHead是一个指针,链表的结点也是指针类型,那么pHead就可以指向多个指针,这样就可以把链表的所有结点连接起来形成一条链。
由于链表中的内存不是一次性分配的,因而我们无法保证链表的内存和数组一样时连续的。因此,如果想在链表中找到它的第i个节点,那么我们只能从头节点开始,沿着指向下一个节点的指针遍历链表,它的时间效率为O(n)。而在数组中,我们可以根据下标在O(1)时间内找到第i个元素。下面是在链表中找到第一个含有某值的节点并删除该节点的代码:
void RemoveNode(ListNode** pHead, int value)
{
if (pHead == NULL && (*pHead) == NULL)//如果链表为空
{
return;
}
ListNode* pdelete = NULL;
if ((*pHead)->vaule == value)
{
pdelete = *pHead;
*pHead = (*pHead)->next;
}
else
{
ListNode* pNode = *pHead;
while (pNode->next != NULL && pNode->next->value != value)
{
pNode = pNode->next;
}
if (pNode->next != NULL && pNode->next->value == value)
{
pdelete = pNode->next;
pNode->next = Pnode->next->next;
}
}
if (pdelete != NULL)
{
delete pdelete;
pdelete = NULL;
}
}
从尾到头打印链表
我们可以用栈实现这种顺序。每经过一个节点的时候,把该节点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出节点的值,此时输出的结点的顺序已经反转过来了。这种思路的实现代码如下:
void printf_RList(ListNode *pHead)
{
stack<ListNode*>nodes;
ListNode* pNode = pHead;
while (pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->next;
}
while (!nodes.empty())
{
pNode = node.top();
cout << pNode << " ";
nodes.pop();
}
}
既然想到了用栈来解决这个函数,而递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现。要实现反过来的链表,我们每访问到一个节点的时候,先递归输出它后面的节点,再输出该节点自身,这样链表的输出结果就反过来了。
基于这样的思路不难写出如下代码:
void printf_RList(ListNode* pHead)
{
if (pHead != NULL)
{
if (pHead->next != NULL)
{
printf_RList(pHead->next);
}
cout << pHead->value<<" ";
}
}
剑指offer 6:链表(从头到尾打印链表)的更多相关文章
- 剑指 offer set 2 从头到尾打印链表
		总结 1. 书中给出的最终解法是递归或用堆栈模拟递归. 之前我一直不清楚是否还有更优雅的做法, 看样是没了 
- 剑指Offer——从尾到头打印链表
		题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 分析: 方法1:利用栈的性质,先从头到尾遍历链表每个节点的值存入栈中,最后一个一个出栈顺序便是从尾到头的. 方法2:直接从头到尾遍历链表存储节 ... 
- 剑指Offer 从尾到头打印链表
		题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路: 用容器vector,递归到最后一个元素,push_back到 ... 
- 剑指offer——从尾到头打印链表节点的值
		输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总 ... 
- [剑指Offer]6-从尾到头打印链表
		典型的后进先出,可以借助栈,也可以使用递归. 考虑到若链表过长递归可能造成函数调用栈溢出,所以使用栈更好. 注意stack无遍历操作,全部用push(),pop(),top()完成. 以下创建列表胡乱 ... 
- 剑指offer —— 从尾到头打印链表
		1.问题:输入一个链表,从尾到头打印链表每个节点的值. /** * public class ListNode { * int val; * ListNode next = null; * * Lis ... 
- 用js刷剑指offer(从尾到头打印链表)
		题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = nu ... 
- 4、剑指offer——从尾到头打印链表java实现
		**题目描述** **输入一个链表,按链表从尾到头的顺序返回一个ArrayList.** 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 思路: 1.如果链 ... 
- 剑指Offer - 九度1524 - 复杂链表的复制
		剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ... 
- 剑指Offer - 九度1518 - 反转链表
		剑指Offer - 九度1518 - 反转链表2013-11-30 03:09 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试 ... 
随机推荐
- vins_fusion学习笔记
			Vins-Fusion源码:https://github.com/HKUST-Aerial-Robotics/VINS-Fusion 摘要 应项目需要,侧重学习stereo+gps融合 转载几篇写的比 ... 
- IntelliJ IDEA 超实用使用技巧分享
			https://blog.csdn.net/weixin_38405253/article/details/102583954 知识点概览: 高效率配置 日常使用 必备快捷键(★★) 查找 跳转切换 ... 
- 从URL重写中学习正则表达式
			起因: 最近因为业务上的需求,老板要求改写网站的域名.要求把所有的二级域名中的内容放到主域名下,增加资源集中程度,有利于搜索引擎的优化. so.网站中所有的URL定向都要重写,也就是我们所说的伪静态的 ... 
- git自动提交脚本
			每次在linux都要重新一遍一遍敲着这些重复的代码,我想着能够优化一下,做个一键脚本,减少重复劳动. #!/bin/bash git status read -r -p "是否继续提交? [ ... 
- 一步步在 github pages 上用 jekyll 搭建属于自己的博客
			序 我的专业与互联网没有太大关系,接触博客还是工作以后的事情.随着工作的经验增加,总想将自己的所思所得记录下来,毕竟,好记性不如烂笔头. 开始是将自己的总结在本地保存,但是本地有一个劣势,就是不能随时 ... 
- Go语言-1-标识符与变量
			目录 1. Go标识符 1.1 Go关键字 1.2 常量标识符(4个) 1.3 空白标识符(1个) 1.4 内置数据类型标识符 1.5 内置函数(15个) 2. Go语言操作符 3. Go语言变量 3 ... 
- [转] Nginx配置中的location、root、alias
			Nginx配置中的location.root.alias location & root 初始配置 [root@adailinux vhost]# cat rio.conf server { ... 
- webuploader-异步切片上传(暂不支持断点续传)及 下载方法!C#/.NET
			十年河东,十年河西,莫欺少年穷 学无止境,精益求精 进入正题: 关于webuploader,参考网址:https://fex.baidu.com/webuploader/: 本篇博客范例下载地址:ht ... 
- MySql5.7配置文件my.ini 设置 my.ini文件路径
			mysql配置文件my-default.ini my.ini修改后重启无效,原来是路径错了,记录一下: windows操作系统下: 1. 由于我们使用MySql 时,需要修改mysql 的 my.i ... 
- Django模板系统:Template
			一.模板常用语法 1.1 变量 符号:{{ }} 表示变量,在模板渲染的时候替换成值 使用方式:{{ 变量名 }}:变量名由字母数字和下划线组成 点(.)在模板语言中有特殊的含义,用来获取对象的相应属 ... 
