将单向链表按某值划分成左边小、 中间相等、 右边大的形式
【题目】
给定一个单向链表的头节点head, 节点的值类型是整型, 再给定一个整数pivot。 实现一个调整链表的函数, 将链表调整为左部分都是值小于pivot的节点, 中间部分都是值等于pivot的节点, 右部分都是值大于pivot的节点。 除这个要求外, 对调整后的节点顺序没有更多的要求。
例如: 链表9->0->4->5->1, pivot=3。
调整后链表可以是1->0->4->9->5, 也可以是0->1->9->5->4。 总之, 满足左部分都是小于3的节点, 中间部分都是等于3的节点(本例中这个部分为空) , 右部分都是大于3的节点即可。 对某部分内部的节点顺序不做要求。
#include<iostream>
#include<string>
#include<vector>
#include<list>
using namespace std;
class node
{
public:
int num;
node *next;
node()
{
num = 0;
next = NULL;
}
};
class List
{
public:
node *head;
node *end;
List()
{
head = NULL;
end = NULL;
}
void insert(int dum)
{
node *n = new node();
n->num = dum;
if (!head)
{
head = n;
end = n;
}
else
{
n->next = end->next;
end->next = n;
end = n;
}
}
~List()//因为需要连接方法两个链表,尝试析构失败,暂时想不到办法,只能在结尾处析构
{
}
};
int main()
{
List l;
int p;
cin >> p;
for (int i = 0; i < 5; i++)
{
int dum;
cin >> dum;
l.insert(dum);
}
List s, e, b;
node* head = l.head;
while (head)
{
if (head->num < p)
{
s.insert(head->num);
}
else if (head->num == p)
{
e.insert(head->num);
}
else
{
b.insert(head->num);
}
head = head->next;
}
List* res;
//中段和小段连接
if (s.head)
{
s.end->next = e.head;
e.end = e.end ? e.end : s.end;//如果中段不存在则跳过中段
}
//中段和大段连接
if (e.end)
{
e.end->next = b.head ? b.head : NULL;
}
res = s.head ? &s : e.head ? &e : &b;
node* dum = new node();
dum = res->head;
while (dum)
{
cout << dum->num;
dum = dum->next;
}
//释放动态内存
dum = res->head;
node *beh = NULL;
while (dum)
{
beh = dum->next;
delete dum;
dum = beh;
}
dum = l.head;
beh = NULL;
while (dum)
{
beh = dum->next;
delete dum;
dum = beh;
}
}