在 C++ 程式中刪除連結串列中間節點


在本教程中,我們將學習如何在連結串列中刪除中間節點。

問題的解決方案很簡單。我們將使用兩個指標,一個每次移動一個節點,另一個每次移動兩個節點。當第二個指標到達最後一個節點時,第一個指標將位於連結串列的中間。

讓我們看看解決問題的步驟。

  • 為連結串列節點編寫一個結構體 Node。

  • 使用虛擬資料初始化連結串列。

  • 編寫一個函式來刪除連結串列。

    • 用連結串列頭指標初始化兩個指標(slow 和 fast)。

    • 遍歷連結串列,直到 fast 指標到達末尾。

    • 將 slow 指標移動到下一個節點。

    • 將 fast 指標移動到下下一個節點。

    • 返回頭指標

  • 列印連結串列。

示例

讓我們看看程式碼。

 線上演示

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node* next;
};
struct Node* deleteMiddleNode(struct Node* head) {
   if (head == NULL) {
      return NULL;
   }
   if (head->next == NULL) {
      delete head;
      return NULL;
   }
   struct Node* slow_ptr = head;
   struct Node* fast_ptr = head;
   struct Node* prev;
   while (fast_ptr != NULL && fast_ptr->next != NULL) {
      fast_ptr = fast_ptr->next->next;
      prev = slow_ptr;
      slow_ptr = slow_ptr->next;
   }
   prev->next = slow_ptr->next;
   delete slow_ptr;
   return head;
}
void printLinkedList(struct Node* node) {
   while (node != NULL) {
      cout << node->data << " -> ";
      node = node->next;
   }
   cout << "Null" << endl;
}
Node* newNode(int data) {
   struct Node* temp = new Node;
   temp->data = data;
   temp->next = NULL;
   return temp;
}
int main() {
   struct Node* head = newNode(1);
   head->next = newNode(2);
   head->next->next = newNode(3);
   head->next->next->next = newNode(4);
   head->next->next->next->next = newNode(5);
   head->next->next->next->next->next = newNode(6);
   cout << "Linked list before deleting middle node: ";
   printLinkedList(head);
   head = deleteMiddleNode(head);
   cout << "Linked List after deleting middle node: ";
   printLinkedList(head);
   return 0;
}

輸出

如果執行上述程式,您將獲得以下結果。

Linked list before deleting middle node: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> Null
Linked List after deleting middle node: 1 -> 2 -> 3 -> 5 -> 6 -> Null

結論

如果您在教程中有任何疑問,請在評論區提出。

更新於: 2021年1月27日

3K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.