剑指offer:面试题06. 从尾到头打印链表
生活随笔
收集整理的這篇文章主要介紹了
剑指offer:面试题06. 从尾到头打印链表
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目:從尾到頭打印鏈表
輸入一個鏈表的頭節(jié)點(diǎn),從尾到頭反過來返回每個節(jié)點(diǎn)的值(用數(shù)組返回)。
示例 1:
輸入:head = [1,3,2]
輸出:[2,3,1]
限制:
0 <= 鏈表長度 <= 10000
題目:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:vector<int> reversePrint(ListNode* head) {}};
解題:
方法一:從頭到尾遍歷,最后做逆序操作
時間復(fù)雜度O(n),空間復(fù)雜度O(n)
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:vector<int> reversePrint(ListNode* head) {vector<int> arrays;while(head) {arrays.emplace_back(head->val);head = head->next;}reverse(arrays.begin(), arrays.end());return arrays;}
};
- ListNode的結(jié)構(gòu)補(bǔ)充
struct ListNode {int val; //當(dāng)前結(jié)點(diǎn)的值ListNode *next; //指向下一個結(jié)點(diǎn)的指針ListNode(int x) : val(x), next(NULL) {} //初始化當(dāng)前結(jié)點(diǎn)值為x,指針為空};/**********************************************************/
ListNode* temp1 = new Solution::ListNode(0); //創(chuàng)建新元素,
ListNode* l1 = temp1; //最后的結(jié)果l1指向temp1,這樣可以獲取temp所接收的全部元素,而temp的指針由于每次都往下移,所以每次都更新while ((c = getchar()) != '\n') //以空格區(qū)分各個結(jié)點(diǎn)的值{if (c != ' '){ungetc(c, stdin); //把不是空格的字符丟回去cin >> num;Solution::ListNode* newnode = new Solution::ListNode(0);newnode->val = num;//創(chuàng)建新的結(jié)點(diǎn)存放鍵盤中讀入的值newnode->next = NULL;temp2->next = newnode;//并將其賦值給temp2temp2 = newnode; //此處也可以寫成 temp2=temp2->next,使指針指向下一個,以待接收新元素}}
- 補(bǔ)充reverse:reverse函數(shù)用于反轉(zhuǎn)在[first,last)范圍內(nèi)的順序(包括first指向的元素,不包括last指向的元素),reverse函數(shù)沒有返回值。
方法二:鏈表反轉(zhuǎn)
時間復(fù)雜度O(n),空間復(fù)雜度O(1)(鏈表翻轉(zhuǎn)利用的額外空間不過是幾根指針)
鏈表反轉(zhuǎn),即從頭到位依次將原先的鏈接反向,這樣最后遍歷一次鏈表就可以得到逆序輸出的數(shù)據(jù),頭插法的具體步驟和代碼如下圖:
class Solution {
public:vector<int> reversePrint(ListNode* head) {if (!head) return vector<int>();ListNode* prev{nullptr}, *succ{nullptr};// 用頭插法對鏈表進(jìn)行逆序while(head){succ = head->next;head->next = prev;prev = head;head = succ;}vector<int> rslVec;head = prev; // 將head回退一次while(head){rslVec.emplace_back(head->val);head = head->next;}return rslVec;}
};
方法三:
class Solution {
public:vector<int> reversePrint(ListNode* head) {vector<int> res;if(head == NULL){return;}return res;}void rescursive(ListNode* head, vector<int>& res){if(head == NULL){return;}rescursive(head->next, res);res.push_back(head->val);}
};
方法四:
class Solution {
public:vector<int> reversePrint(ListNode* head) {stack<int> st;while(head) {st.push(head->val);head=head->next;}vector<int> res;while(!st.empty()) {res.push_back(st.top());st.pop();}return res;}
};
總結(jié)
以上是生活随笔為你收集整理的剑指offer:面试题06. 从尾到头打印链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer:面试题05. 替换空格
- 下一篇: 剑指offer:面试题07. 重建二叉树