记录来自《剑指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--从尾到头打印链表相关推荐

  1. 剑指Offer 从尾到头打印链表

    题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的"新链表"的表头 思路: 用容器vector,递归到最后一个元素, ...

  2. java输出链表的值_[剑指offer] 从尾到头打印链表(三种方法) java

    一.每次把新遍历的链表值放到list索引为0的位置,实现逆序. public class Solution { public ArrayList printListFromTailToHead(Lis ...

  3. 剑指offer06.从尾到头打印链表

    剑指offer06.从尾到头打印链表 1. 改变链表结构的解法 2.可以使用栈,递归,或者直接反向输出数组 提示: 若是面试遇到此题,最好先向面试官确认是否可以改变链表的结构, 1. 改变链表结构的解 ...

  4. JavaScript——leetcode剑指06 从尾到头打印链表

    JavaScript--leetcode剑指06从尾到头打印链表 题目描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出: ...

  5. 剑指offer5 从尾到头打印链表

    错误代码: class Solution { public:vector<int> printListFromTailToHead(ListNode* head){vector<in ...

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

    /** *  struct ListNode { *        int val; *        struct ListNode *next; *        ListNode(int x) ...

  7. 【剑指Offer】从尾到头打印链表

    剑指Offer 从尾到头打印链表 题目描述 解法1 实现代码 一点补充 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解法1 这道题主要思路是while循环从头遍历整个列 ...

  8. 【三种解法】剑指 Offer 06. 从尾到头打印链表【附完整可运行代码】

    立志用最少的代码做最高效的表达 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表 ...

  9. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  10. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java

    <LeetCode力扣练习>剑指 Offer 06. 从尾到头打印链表 Java 一.资源 题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入: ...

最新文章

  1. 手把手教你写网络爬虫(4)Scrapy入门
  2. MATLAB | matlab运行、下载链接及21个matlab基本图像调试代码
  3. python截取关键字后的字符串_使用正则表达式获取python中特定字符串之后的所有内容...
  4. python 中arange函数_浅谈Python中range与Numpy中arange的比较
  5. C++ VS Java 系列 —— 访问控制
  6. java大数据开发是做什么的_3年Java开发转型大数据,如何跳出CRUD舒适区?
  7. 微信开发者工具下载及APPID获取
  8. 富士通服务器irmc账号密码,PRIMERGY TX1330 M2 E3-1200 V5单路 Fujitsu富士通立式服务器...
  9. Python 刷题笔记:背包问题
  10. 联通路由器设置FTP服务器,做家庭储存云盘
  11. amend和rebase
  12. ubuntu20.04安装常用的软件
  13. for循环后面的分号
  14. NavicatPremium从excel文件导入表数据
  15. 如今的iOS开发者优胜劣汰,如何提升让自己不被淘汰?
  16. js 实现经纬度转 城市-区县-街道
  17. Unsupported major.minor version 52.0 解决方案
  18. Ubuntu、Debian 系统安装 PHP 7.4 教程,超简单,一把梭!
  19. 在ARM板子上把玩Tensorflow Lite
  20. Oracle 10g在线整理碎片索引是否失效

热门文章

  1. mysql ddl dql_mysql DDL、DML、DCL、DQL区分
  2. 7价 半导体掺杂_天津大学封伟团队:新型半导体二维原子晶体锗硅烷材料的带隙调控...
  3. 计算机如何查找目标,如何使用命令行查找计算机地理位置? | MOS86
  4. 带研发团队后的日常思考1 初级管理者的困惑
  5. 利用SecureCRT在linux与Windows之间传输文件
  6. element 增加自由验证
  7. React开发(136):ant design学习指南之form中动态form新增删除
  8. 前端学习(3277):promise的使用
  9. react学习(70)--拼接方式
  10. 前端学习(3219):对props进行限制