重磅乾貨,第一時間送達c++
從尾到頭打印鏈表程序員
輸入一個鏈表的頭結點,從尾到頭反過來打印出每一個結點的值面試
要想從尾到頭遍歷鏈表,首先須要作的是倒轉鏈表,再進行遍歷。
該題思路:建立一個空列表,用來存儲鏈表中的值,最後將列表逆序輸出
下面咱們來舉個例子:正則表達式
題目要求,從尾到頭遍歷單鏈表。也就是第一個遍歷到的節點要最後一個輸出,最後一個遍歷到的節點第一個輸出。這就是典型的「後進先出」,由此可藉助棧實現這種順序。
每通過一個結點的時候,把該結點放到一個棧中。
當遍歷完整個鏈表後,再從棧頂開始逐個輸出結點的值,此時輸出的結點的順序已經反轉過來了。算法
遞歸在本質上就是一個棧結構。數組
要實現反過來輸出鏈表,咱們每訪問到一個結點的時候,先遞歸輸出它後面的結點,再輸出該結點自身,這樣鏈表的輸出結果就反過來了。微信
但有個問題:
當鏈表很是長的時候,就會致使函數調用的層級很深,從而有可能致使函數調用棧溢出。數據結構
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回從尾部到頭部的列表值序列,例如[1,2,3] # 該題思路:建立一個空列表,用來存儲鏈表中的值,最後將列表逆序輸出 def printListFromTailToHead(self, listNode): # write code here if not listNode: return [] result = [] while listNode.next is not None: # extend() 函數用於在列表末尾一次性追加另外一個序列中的多個值(用新列表擴展原來的列表)。 result.extend([listNode.val]) listNode = listNode.next # 退出循環恰好在末尾節點,將末尾節點也添加進去 result.extend([listNode.val]) return result[::-1]
c++的vector能夠用insert()函數來向指定位置插入元素,arr.begin()表示在頭部,arr.end()表示在尾部。例如:機器學習
//在頭部插入10 arr.insert(arr.begin(),10); //在尾部插入8 arr.insert(arr.end(),8);
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ class Solution { public: vector<int> printListFromTailToHead(ListNode* head) { vector<int> arr; while(head){ arr.insert(arr.begin(),head->val); head = head->next; } return arr; } };
public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { //使用 棧 這種數據結構 Stack<Integer> stack = new Stack<>(); //將鏈表元素所有存放在 棧 裏面 while (listNode != null) { stack.add(listNode.val); listNode = listNode.next; } ArrayList<Integer> ret = new ArrayList<>(); //取出棧裏面的元素 while (!stack.isEmpty()) ret.add(stack.pop()); return ret; } }
注:面試季來了,無論是做爲面試者仍是之後做爲面試官,瞭解算法這門程序員之間的溝通方式都是很是必要的。找過工做的朋友應該都據說過《劍指offer》,雖然書中只有六十多道題目,可是道道都是經典。ide
若是是單純的面試需求,劍指offer的優先級確定是在Leetcode以前,總的說它有三個優勢:
它的缺點是:
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆)
▲長按加羣