offer--链表反转和从尾到头打印链表
这个是高频的面试题,今天总结了一些。反转链表用三个指针实现,返回新链表的头节点;而从尾到头打印,应用栈实现,返回vector整个链表。
//题目描述 // //输入一个链表,反转链表后,输出链表的所有元素。 struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(nullptr){} }; //思路 //在反转链表的时候,我们很容易想到让当前结点的next指向前一个结点, //但是这样做了之后这个节点原本next所指的结点就找不回了,所以每次我们都要保存新的前一结点, //当前结点和下一结点三个指针,只要下一结点为空,那么我们就到了原本结点的尾部,这时正是新链表的头部 class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode *current = pHead; ListNode *pre = nullptr; ListNode *pNewNode = nullptr; if (pHead == nullptr) { return nullptr; } while (current != nullptr) //当前结点不为空 { ListNode *pnext = current->next; //当前结点的后继 if (pnext == nullptr) { pNewNode = current; //最后结点,即反转链表的头节点 } current->next = pre; //当前结点的后继转为前驱 pre = current; //前驱转为当前结点 current = pnext; //当前结点向后移 } return pNewNode; } }; //1、三个指针在链表上同时滑动,比较容易想到但是编码略复杂 class Solution { public: ListNode* ReverseList(ListNode* pHead) { if (pHead == nullptr) return nullptr; if (pHead->next == nullptr) return pHead; ListNode *pBefore = pHead, *p = pHead->next, *pAfter = p->next; while (pAfter) { p->next = pBefore; // reverse pBefore = p; p = pAfter; pAfter = pAfter->next; } p->next = pBefore; //完成最后一个结点的前驱 pHead->next = nullptr; //尾结点后继为空 return p; } }; //2、从原链表的头部一个一个取节点并插入到新链表的头部 class Solution { public: ListNode* ReverseList(ListNode* pHead) { if (pHead == nullptr) return nullptr; ListNode* head = pHead; pHead = pHead->next; head->next = nullptr; //此时的head为尾结点 while (pHead) { ListNode *next = pHead->next; pHead->next = head; head = pHead; // pHead = next; } return head; } }; //使用一个栈来解决问题,C++ #include<stack> using namespace std; class Solution { public: ListNode* ReverseList(ListNode* pHead) { if (pHead == nullptr || pHead->next == nullptr) { return pHead; } ListNode * p = pHead; ListNode * newHead; stack<ListNode *> stack1; while (p->next != NULL) { stack1.push(p); p = p->next; } newHead = p; while (!stack1.empty()) { p->next = stack1.top(); p = p->next; stack1.pop(); } p->next = NULL; return newHead; } }; //题目描述 // //输入一个链表,从尾到头打印链表每个节点的值。 //输入描述 : //输入为链表的表头 // // //输出描述 : //输出为需要打印的“新链表”的表头 #include<vector> class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { //std::stack<ListNode*> nodes; // ListNode *pNode = head; // while(pNode != NULL) // { // nodes.push(head); // head = head->next; // } // while(!nodes.empty()) // { // head = nodes.top(); // printf("%d\t" ,head->val); // nodes.pop(); // } vector<int> dev1; if (head != NULL) { if (head->next != NULL) { dev1 = printListFromTailToHead(head->next); } dev1.push_back(head->val); } return dev1; } }; class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { //利用栈的逆序输出特性 stack<int> stack; vector<int> vector; struct ListNode *p = head; if (head != NULL) { stack.push(p->val); while ((p = p->next) != NULL) { stack.push(p->val); } while (!stack.empty()) { vector.push_back(stack.top()); stack.pop(); } } return vector; } }; /*** *从原理上来说,借助栈会使得问题的解决思路非常简单明了。 *注意函数的返回类型是int类型的vector */ class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { vector<int> vec; //声明一个vector存放Node的int类型的val值 std::stack<ListNode *>nodes; ListNode *pNode = head; //遍历入栈 while (pNode != NULL) { nodes.push(pNode); //遍历所有节点,将结点压入栈中 pNode = pNode->next; } //遍历出栈 while (!nodes.empty()) { pNode = nodes.top(); //定义的结点指针始终指向栈顶,取出栈顶结点的val值存入到定义的vec中,然后弹出栈顶元素。由栈顶往栈底遍历 vec.push_back(pNode->val); nodes.pop(); } return vec; //返回值为int型的vector } };
offer--链表反转和从尾到头打印链表的更多相关文章
- 剑指Offer - 九度1511 - 从尾到头打印链表
剑指Offer - 九度1511 - 从尾到头打印链表2013-11-29 21:08 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例 ...
- JS 剑指Offer(四) 从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲 function ListNode(val) { t ...
- 剑指offer【03】- 从尾到头打印链表(4种实现方法)
题目:从尾到头打印链表 考点:链表 题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 法一:ArrayList头插法 /** * public class ListNode ...
- 【Offer】[6] 【从尾到头打印链表】
题目描述 思路分析 Java代码 代码链接 题目描述 从尾到头打印链表,将其添加到ArrayList当中输出 思路分析 递归的思路 利用栈 Java代码 public class Offer006 { ...
- 剑指offer(3)从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 题目分析 比较简单,主要注意下从尾到头,可以用栈可以用递归,我给出我比较喜欢的代码吧 代码 /* function ListNode(x){ t ...
- 【剑指Offer】3、从尾到头打印链表
题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: (三种方法:借助栈.递归.列表的首位插入) 从头到尾打印链表比较简单,从尾到头很自然的可以 ...
- 剑指offer第二版-6.从尾到头打印链表
描述:输入一个链表的头节点,从尾到头打印每个节点的值. 思路:从尾到头打印,即为“先进后出”,则可以使用栈来处理:考虑递归的本质也是一个栈结构,可递归输出. 考点:对链表.栈.递归的理解. packa ...
- 剑指offer(5)——从尾到头打印链表
题目: 输入一个链表的头结点,从尾到头反过来打印出每个结点的值.结点定义如下: public class ListNode { int val; ListNode next = null; ListN ...
- 剑指Offer编程题3——从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 题目解析 方法1:建立两个vector,第一个用来存储正向访问的数据,第二个用来反向存储. /** * struct L ...
随机推荐
- HDU 4747 Mex(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:给出一个数列A.计算所有的mex(i,j)之和.1<=i<=j<=n. ...
- php关于static关键字
静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用.静态方法中,$this伪变量不允许使用.可以使用self,parent,s ...
- git使用ssh协议,生成公钥和私钥,并指定私钥
http://superuser.com/questions/232373/how-to-tell-git-which-private-key-to-use In ~/.ssh/config, add ...
- [51NOD1181]质数中的质数(质数筛法)(欧拉筛)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1181 思路:欧拉筛出所有素数和一个数的判定,找到大于n的最小质 ...
- HeadFirst 12 (web应用安全)
测试领域可以使用的方法,在tomcat-users.xml 中设置授权, 为什么这个不能在生产环境中呢, 因为如果这个设置在生产环境中, 那么当你想修改”授权时”, 就要修改这个xml文件, 那么就要 ...
- 使用JAVA直观感受快速排序与冒泡排序的性能差异
初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对 ...
- core--线程同步(用户模式)
用户模式下的多线程同步只适用用于同一个进程内的多个线程,其范围使用于读写问题:比如一本书,必须是作者A写完之后,读者B才能够读取.否则作者一边修改,读者一边读,完全乱套. 线程读者B如何能在多线程环境 ...
- Qt之等待提示框(QTimer)
简述 上节讲述了关于QPropertyAnimation实现等待提示框的显示,本节我们使用另外一种方案来实现-使用定时器QTimer,通过设置超时时间定时更新图标达到旋转效果. 简述 效果 资源 源码 ...
- php最新出现的函数
1. 数据过滤函数 filter_var: filter_var — Filters a variable with a specified filter 过滤的类型有: Validate filt ...
- 【转】发布的QT程序无法显示图标和图片的问题
在windows下编译好的QT程序在其他没有安装QT的机器上会出现图标和图片无法正常显示的问题. 这时我们可以通过以下方式来解决: 在release文件夹里创建plugins文件夹,并将QT安装目录下 ...