剑指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 << " ";}
}
更完整的代码例子可以查看从尾到头打印链表。
剑指offer--从尾到头打印链表相关推荐
- 剑指Offer 从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的"新链表"的表头 思路: 用容器vector,递归到最后一个元素, ...
- java输出链表的值_[剑指offer] 从尾到头打印链表(三种方法) java
一.每次把新遍历的链表值放到list索引为0的位置,实现逆序. public class Solution { public ArrayList printListFromTailToHead(Lis ...
- 剑指offer06.从尾到头打印链表
剑指offer06.从尾到头打印链表 1. 改变链表结构的解法 2.可以使用栈,递归,或者直接反向输出数组 提示: 若是面试遇到此题,最好先向面试官确认是否可以改变链表的结构, 1. 改变链表结构的解 ...
- JavaScript——leetcode剑指06 从尾到头打印链表
JavaScript--leetcode剑指06从尾到头打印链表 题目描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出: ...
- 剑指offer5 从尾到头打印链表
错误代码: class Solution { public:vector<int> printListFromTailToHead(ListNode* head){vector<in ...
- 剑指offer-3 从尾到头打印链表
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) ...
- 【剑指Offer】从尾到头打印链表
剑指Offer 从尾到头打印链表 题目描述 解法1 实现代码 一点补充 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解法1 这道题主要思路是while循环从头遍历整个列 ...
- 【三种解法】剑指 Offer 06. 从尾到头打印链表【附完整可运行代码】
立志用最少的代码做最高效的表达 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表 ...
- 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...
- 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java
<LeetCode力扣练习>剑指 Offer 06. 从尾到头打印链表 Java 一.资源 题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入: ...
最新文章
- 手把手教你写网络爬虫(4)Scrapy入门
- MATLAB | matlab运行、下载链接及21个matlab基本图像调试代码
- python截取关键字后的字符串_使用正则表达式获取python中特定字符串之后的所有内容...
- python 中arange函数_浅谈Python中range与Numpy中arange的比较
- C++ VS Java 系列 —— 访问控制
- java大数据开发是做什么的_3年Java开发转型大数据,如何跳出CRUD舒适区?
- 微信开发者工具下载及APPID获取
- 富士通服务器irmc账号密码,PRIMERGY TX1330 M2 E3-1200 V5单路 Fujitsu富士通立式服务器...
- Python 刷题笔记:背包问题
- 联通路由器设置FTP服务器,做家庭储存云盘
- amend和rebase
- ubuntu20.04安装常用的软件
- for循环后面的分号
- NavicatPremium从excel文件导入表数据
- 如今的iOS开发者优胜劣汰,如何提升让自己不被淘汰?
- js 实现经纬度转 城市-区县-街道
- Unsupported major.minor version 52.0 解决方案
- Ubuntu、Debian 系统安装 PHP 7.4 教程,超简单,一把梭!
- 在ARM板子上把玩Tensorflow Lite
- Oracle 10g在线整理碎片索引是否失效
热门文章
- mysql ddl dql_mysql DDL、DML、DCL、DQL区分
- 7价 半导体掺杂_天津大学封伟团队:新型半导体二维原子晶体锗硅烷材料的带隙调控...
- 计算机如何查找目标,如何使用命令行查找计算机地理位置? | MOS86
- 带研发团队后的日常思考1 初级管理者的困惑
- 利用SecureCRT在linux与Windows之间传输文件
- element 增加自由验证
- React开发(136):ant design学习指南之form中动态form新增删除
- 前端学习(3277):promise的使用
- react学习(70)--拼接方式
- 前端学习(3219):对props进行限制