使用遞歸從已排序的鍊錶中刪除重複項
鍊錶是連接在一起的元素序列。每個列表都有一個頭和一系列節點,每個節點都有當前節點的資料並連結到下一個節點。鍊錶的基本操作是插入、刪除、尋找和刪除。
從排序鍊錶中刪除重複項
刪除節點的一種方法是使用遞歸。其想法是將每個節點與其相鄰節點進行比較,並刪除它們相等的重複節點。
我們的遞歸呼叫將會回到下一個節點。因此,對於下一個元素,我們將呼叫遞歸函數,例如 current_node->next = our_function(node->next)。
我們相信我們的遞歸,current_node->next 現在包含鍊錶,其中沒有任何重複元素。
在主要方法中,我們從頭開始競價清單 -
Node* head = new Node(5); head->next = new Node(5); head->next->next = new Node(6); head->next->next->next = new Node(7); head->next->next->next->next = new Node(7); head->next->next->next->next->next = new Node(7);
演算法
使用遞歸從排序鍊錶中刪除重複項目的方法的過程如下。
第 1 步 - 建立一個鍊錶,其中所有值按順序排序
步驟 2 - 如果鍊錶不存在,則程式終止。
步驟 3 - 如果鍊錶確實存在,則將頭節點的下一個值與頭節點中的值進行比較。如果兩個值相同,則刪除頭部。
第4 步 - 第3 步驟遞歸執行, 將每個節點視為頭,直到清單刪除所有重複值來自自身。
步驟 5 - 得到的輸出是具有不同值的排序鍊錶
範例
例如,我們有一個具有以下值的排序鍊錶 -
1->1->1->2->3->3->4
#讓我們看一個 C 程序,它將使用遞歸從上面的排序鍊錶中刪除重複項 -
#include <iostream> using namespace std; class Node { public: int data; Node* next; Node(int data) { this->data = data; next = NULL; } }; Node* solve(Node* head) { if (head == NULL) return NULL; head->next = solve(head->next); if (head->next != NULL && head->next->data == head->data) { Node* temp = head->next; delete head; return temp; } return head; } void printList(Node* node) { while (node != NULL) { cout << node->data << (node->next == NULL ? "" : "->"); node = node->next; } } int main() { Node* head = new Node(1); head->next = new Node(1); head->next->next = new Node(1); head->next->next->next = new Node(2); head->next->next->next->next = new Node(3); head->next->next->next->next->next = new Node(3); head->next->next->next->next->next->next = new Node(4); cout << "Linked list before: "; printList(head); head = solve(head); cout << "\nLinked list after: "; printList(head); return 0; }
之後,我們檢查是否將目前節點包含到鍊錶中。如果我們從目前節點->下一個節點得到的滿足鍊錶與該節點具有相同的值,則不包含該節點;否則,我們將包括在內。
注意 - 當目前節點為 NULL 時,我們傳回遞歸的基本條件。
輸出
Linked list before: 1->1->1->2->3->3->4 Linked list after: 1->2->3->4
結論
正如我們在遞歸呼叫中所看到的,我們相信下一次呼叫能夠實現問題其餘部分的預期結果。我們剛剛解決了當前的子問題。記住這一點,我們檢查是否可以包含當前元素,並將鍊錶的其餘部分交給我們的遞歸調用,並信任它從那時起為我們提供有效的鍊錶。當我們遍歷整個鍊錶時,我們的方法的時間複雜度是 O(n)。
以上是使用遞歸從已排序的鍊錶中刪除重複項的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

C++函數的遞歸深度受到限制,超過此限制會導致堆疊溢位錯誤。限制值因係統和編譯器而異,通常在1000到10000之間。解決方法包括:1.尾遞歸最佳化;2.尾呼叫;3.迭代實作。

1.首先,拉黑再刪除永久加不上是假的,拉黑刪除後想要再加對方,只要對方同意即可。 2.如果用戶將某人封鎖,對方將無法向用戶發送訊息、查看用戶的朋友圈、與用戶通話。 3.封鎖並不意味著將對方從用戶的微信聯絡人清單中刪除。 4.如果用戶在封鎖後又將對方從用戶的微信聯絡人清單中刪除,那麼在刪除後是沒有辦法恢復的。 5.如果用戶想再加入對方為好友,需要對方同意並重新新增使用者。

1.開啟抖音app,點選介面底部的【訊息】,點選需要刪除的聊天對話入口。 2.長按任一聊天記錄,點選【多選】,勾選想要刪除的聊天記錄。 3.點選右下角的【刪除】按鈕,在彈出的視窗中選擇【確認刪除】即可將這些記錄永久刪除。

是的,C++Lambda表達式可以透過使用std::function支援遞歸:使用std::function捕捉Lambda表達式的參考。透過捕獲的引用,Lambda表達式可以遞歸呼叫自身。

PHP實用技巧:刪除程式碼中的最後一個分號在寫PHP程式碼時,常常會遇到需要刪除程式碼中最後一個分號的情況。這可能是因為複製貼上引入了多餘的分號,或是為了優化程式碼風格和結構。在本文中,我們將介紹一些方法來刪除PHP程式碼中的最後一個分號,並且提供具體的程式碼範例。方法一:使用substr函數substr函數可以從字串中傳回指定長度的子字串。我們可以

遞歸演算法透過函數自呼叫解決結構化的問題,優點是簡潔易懂,缺點是效率較低且可能發生堆疊溢位;非遞歸演算法透過明確管理堆疊資料結構避免遞歸,優點是效率更高且避免堆疊溢出,缺點是程式碼可能更複雜。選擇遞歸或非遞歸取決於問題和實現的特定限制。

1.打開微信app,點選右下角的【我】,找到並點選【朋友圈】選項。 2.點選右上角的【我的朋友圈】,在我的朋友圈介面找到想要刪除的朋友圈內容。 3.點選進入這條朋友圈的詳情頁,點選該條內容發佈時間右側的【小垃圾桶】圖示。 4.在彈出的視窗中選擇【確定】即可,這樣就完成了刪除朋友圈內容的操作。

尾遞歸最佳化(TRO)可提高特定遞歸呼叫的效率。它將尾遞歸呼叫轉換為跳轉指令,並將上下文狀態保存在暫存器中,而不是堆疊上,從而消除對堆疊的額外呼叫和返回操作,提高演算法效率。利用TRO,我們可以針對尾遞歸函數(例如階乘計算)進行最佳化,透過將tail遞歸呼叫替換為goto語句,編譯器會將goto跳轉移化為TRO,最佳化遞歸演算法的執行。
