目錄
從排序鍊錶中刪除重複項
演算法
範例
輸出
結論
首頁 後端開發 C++ 使用遞歸從已排序的鍊錶中刪除重複項

使用遞歸從已排序的鍊錶中刪除重複項

Sep 01, 2023 pm 01:45 PM
鍊錶 重複項 遞迴 刪除 已排序

使用遞歸從已排序的鍊錶中刪除重複項

鍊錶是連接在一起的元素序列。每個列表都有一個頭和一系列節點,每個節點都有當前節點的資料並連結到下一個節點。鍊錶的基本操作是插入、刪除、尋找和刪除。

從排序鍊錶中刪除重複項

刪除節點的一種方法是使用遞歸。其想法是將每個節點與其相鄰節點進行比較,並刪除它們相等的重複節點。

我們的遞歸呼叫將會回到下一個節點。因此,對於下一個元素,我們將呼叫遞歸函數,例如 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1319
25
PHP教程
1269
29
C# 教程
1248
24
C++ 函式的遞歸實作:遞迴深度有限制嗎? C++ 函式的遞歸實作:遞迴深度有限制嗎? Apr 23, 2024 am 09:30 AM

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

微信拉黑再刪除永久加不上是真的嗎 微信拉黑再刪除永久加不上是真的嗎 Apr 08, 2024 am 11:41 AM

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

抖音聊天記錄怎麼徹底消除乾淨 抖音聊天記錄怎麼徹底消除乾淨 May 07, 2024 am 11:14 AM

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

C++ lambda 表達式是否支援遞迴? C++ lambda 表達式是否支援遞迴? Apr 17, 2024 pm 09:06 PM

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

PHP實用技巧:刪除程式碼中的最後一個分號 PHP實用技巧:刪除程式碼中的最後一個分號 Mar 27, 2024 pm 02:24 PM

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

C++ 函式的遞迴實作:遞迴與非遞迴演算法的比較分析? C++ 函式的遞迴實作:遞迴與非遞迴演算法的比較分析? Apr 22, 2024 pm 03:18 PM

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

微信朋友圈怎麼刪除 微信朋友圈怎麼刪除 Apr 08, 2024 pm 03:25 PM

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

C++ 遞歸進階:瞭解尾遞歸最佳化及其應用 C++ 遞歸進階:瞭解尾遞歸最佳化及其應用 Apr 30, 2024 am 10:45 AM

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

See all articles