<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
題目連結 | 難度 |
---|---|
1472. 設計瀏覽器歷史記錄 | ★★★☆☆ |
430. 扁平化多級雙向連結串列 | ★★★☆☆ |
劍指 Offer II 028. 展平多級雙向連結串列 | ★★★☆☆ |
劍指 Offer 36. 二元搜尋樹與雙向連結串列 | ★★★★☆ |
1.這是一個模擬題;
2.初始化生成一個頭結點,記錄一個當前結點;
3.向前 和 向後 是兩個類似的過程,可以統一實現,注意一些邊界條件。
struct Node { string val; Node* prev; Node* next; }; class BrowserHistory { Node * List, *Current; public: BrowserHistory(string homepage) { List = new Node(); List->prev = List->next = nullptr; List->val = homepage; Current = List; } void visit(string url) { Node *Next = Current->next; if(Next == nullptr) { Current->next = new Node(); Current->next->next = nullptr; Current->next->prev = Current; }else { Node *tmp = Next->next; Next->next = nullptr; // free while(tmp) { Node *node = tmp->next; delete tmp; tmp = node; } } Current->next->val = url; Current = Current->next; } string back(int steps) { string str = Current->val; Node *pre; while(steps-- && Current) { pre = Current; Current = Current->prev; if(Current) str = Current->val; } if(nullptr == Current) Current = pre; return str; } string forward(int steps) { string str = Current->val; Node *pre; while(steps-- && Current) { pre = Current; Current = Current->next; if(Current) str = Current->val; } if(nullptr == Current) Current = pre; return str; } };
1.利用一個遞迴函數last = dfs(now),一旦遇到child域非空的結點,則遞迴計算clast = dfs(now->child),返回值是遞迴展平後的最後一個結點,然後進行雙向連結串列的連結操作。
2.例如,當前有 child域的結點為now,它的下一個結點是next,遞迴計算以後得到展平的連結串列的最後一個結點為 clast,則有如下關係:
now <---> now->child ... clast <---> next
3.根據以上關係調整雙向連結串列,注意不要忘記將child域置空。
4.當遍歷到這個雙向連結串列的最後一個結點的時候,如果它有child域,則當前連結串列的最後一個結點就是clast,否則就是它自己now;
class Solution { Node* dfs(Node* head) { Node *now = head; Node *last = nullptr; while(now) { Node *cLast; if(now->child) { cLast = dfs(now->child); Node *next = now->next; // now <--> cFirst ... cLast <---> next; now->next = now->child; now->child = nullptr; now->next->prev = now; if(next) { next->prev = cLast; } cLast->next = next; } if(now->next == nullptr) { if(now->child) { last = cLast; }else { last = now; } } now = now->next; } return last; } public: Node* flatten(Node* head) { if(head == nullptr) { return nullptr; } Node *last = dfs(head); last->next = nullptr; return head; } };
(1)同上一題。
(1)遇到這樣的題,首先需要設計好遞迴函數;
(2)像這個問題,對於 左子樹 和 右子樹,需要知道雙向連結串列的 頭結點 和 尾結點,所以遞迴的時候需要返回 兩個值,於是可以直接採用函數傳指標進行返回,由於二元樹的結點本身就是指標,所以需要傳 二級指標;
(3)遞迴計算左子樹變成雙向連結串列的情況;
(4)遞迴計算右子樹變成雙向連結串列的情況;
(5)將左子樹的雙向連結串列連結到root左邊,將右子樹的雙向連結串列連結到root右邊,然後根據遞迴函數的實際作用,返回 頭結點 和 尾結點。
class Solution { void dfs(Node *root, Node **minNode, Node **maxNode) { if(root == nullptr) { *minNode = nullptr; *maxNode = nullptr; return ; } Node *lminNode, *lmaxNode, *rminNode, *rmaxNode; if(root->left) { dfs(root->left, &lminNode, &lmaxNode); lmaxNode->right = root; root->left = lmaxNode; *minNode = lminNode; }else { *minNode = root; } if(root->right) { dfs(root->right, &rminNode, &rmaxNode); rminNode->left = root; root->right = rminNode; *maxNode = rmaxNode; }else { *maxNode = root; } } public: Node* treeToDoublyList(Node* root) { if(root == nullptr) { return nullptr; } Node *minNode, *maxNode; dfs(root, &minNode, &maxNode); maxNode->right = minNode; minNode->left = maxNode; return minNode; } };
到此這篇關於C語言演演算法學習之雙向連結串列詳解的文章就介紹到這了,更多相關C語言雙向連結串列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45