連結串列劃分為左小、中相等、右大
阿新 • • 發佈:2018-10-31
解題思路:將一個連結串列分成三個連結串列,最後重新連線三個連結串列
(1)分成三個連結串列的過程是一致的:以左小連結串列為例
依次遍歷原連結串列的每一個節點cur,當cur->data<pivot時,把cur取出,
新增到左小連結串列末尾,直到遍歷完整個原連結串列為止。
(2)生成左小、中相等、右大連結串列後,怎麼連線三個連結串列並返回頭結點是難點!
(因為不知道三個連結串列是否為空)
#include<iostream>
using namespace std;
typedef struct TNode
{
int data;
struct TNode* next;
}TNode;
TNode* createL(int n) //建立連結串列
{
TNode* head = NULL;
TNode* tial = NULL;
for (int i = 0; i < n; i++)
{
TNode* node = new TNode;
node->next = NULL;
cout << "請輸入";
cin >> node->data;
if (head == NULL)
{
head = node;
tial = head;
}
else
{
tial->next = node;
tial = node;
}
}
tial->next = NULL;
return head;
}
void travel(TNode* head)
{
cout << "輸出結果:" << endl;
TNode* p = head;
while (p != NULL)
{
cout << p->data << endl;
p = p->next;
}
}
TNode* listPartition(TNode* head, int pivot) //連結串列劃分
{
TNode* sh = NULL;
TNode* st = NULL;
TNode* eh = NULL;
TNode* et = NULL;
TNode* bh = NULL;
TNode* bt = NULL;
//依次遍歷每一個元素
TNode* cur = head;
TNode* s = NULL; //輔助變數,用於儲存cur節點的下一個節點,防止斷鏈
while (cur != NULL)
{
s = cur->next;
cur->next = NULL;//將當前結點cur的指標域設為空,保證每個連結串列的新增節點為最後一個節點
if (cur->data < pivot)
{
if (sh == NULL)
{
sh = cur;
st = cur;
}
else
{
st->next = cur;
st = cur;
}
}
else if (cur->data == pivot)
{
if (eh == NULL)
{
eh = cur;
et = cur;
}
else
{
et->next = cur;
et = cur;
}
}
else if (cur->data > pivot)
{
if (bh == NULL)
{
bh = cur;
bt = cur;
}
else
{
bt->next = cur;
bt = cur;
}
}
cur = s;
}
//難點:將三個不知道是否為空連結串列的連結串列進行連結成一條連結串列,返回最終的頭結點
//依次從左到右假設每個連結串列不為空時,尾節點指標域的指向
if (st != NULL)
{
st->next = (eh != NULL) ? eh : bh;
}
if (et != NULL)
{
et->next = bh;
}
return st != NULL ? sh : et != NULL ? eh : bh;
}
int main()
{
TNode* head = NULL;
head = createL(7);
travel(head);
head = listPartition(head, 3);
travel(head);
return 0;
}