版权声明:本文为博主原创文章,转载请说明。 https://blog.csdn.net/GoJawee/article/details/77961452
解题思路:将一个链表分成三个链表,最后重新连接三个链表
(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;
}