如何在C++中分割給定的連結串列


連結串列是一種線性資料結構,其中每個節點有兩個塊,一個塊包含節點的值或資料,另一個塊包含下一個欄位的地址。

假設我們有一個連結串列,每個節點包含資料和一個指向連結串列下一個節點的指標。任務是分割給定的連結串列。分割連結串列意味著我們必須將列表中奇數索引的節點和偶數索引的節點分開。

解決這個問題的方法

為了分割給定的連結串列,我們將分別為奇數索引、偶數索引和偶數索引的值引入三個指標。之後,我們將遍歷整個連結串列並用某個值初始化指標。

在連結串列中,索引從“1”開始,因此對於任何特定字串,列表的第一個節點將始終被視為奇數索引節點。但是,下一個節點被視為偶數索引節點。

  • 取一個包含資料和指向下一個節點的指標的連結串列。
  • 函式segregateList(listnode *head) 獲取指向頭節點的指標,並返回分割後的連結串列作為輸出。
  • 初始化三個指標oddIndex、evenIndex和evenHead,它們當前都指向列表的頭。
  • 遍歷整個連結串列,並將oddIndex的next指標初始化為evenIndex的next指標。
  • 現在遍歷整個列表,並將evenIndex的next指標初始化為oddIndex的next指標。
  • 返回頭指標。

示例

線上演示

#include <iostream>
using namespace std;
class node {
   public:
      int data;
   node * next;
   node(int d) {
      data = d;
      next = NULL;
   }
};
node * segregateList(node * head) {
   if (head == NULL) {
      return NULL;
   }
   node * oddIndex = head;
   node * evenIndex = head -> next;
   node * evenHead = evenIndex;
   while (evenIndex != NULL and evenIndex -> next != NULL) {
      oddIndex -> next = evenIndex -> next;
      oddIndex = oddIndex -> next;
      evenIndex -> next = oddIndex -> next;
      evenIndex = evenIndex -> next;
   }
   oddIndex -> next = evenHead;
   return head;
}
void insertAtNode(node * & head, int data) {
   node * n = new node(data);
   n -> next = head;
   head = n;
}
void print(node * head) {
   while (head != NULL) {
      cout << head -> data << "->";
      head = head -> next;
   }
}
int main() {
   node * head = NULL;
   // It could be possible that the head node contains NULL Value.
   insertAtNode(head, 5);
   insertAtNode(head, 8);
   insertAtNode(head, 3);
   insertAtNode(head, 1);
   insertAtNode(head, 2);
   print(head);
   cout << endl;
   segregateList(head);
   print(head);
}

執行上述程式碼將生成以下輸出:

輸出

2->3->5->1->8->

給定的連結串列是:2->1->3->8->5->。分割連結串列後,將產生以下輸出:2->3->5->1->8->。

更新於:2021年2月23日

167 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告