单词:partition 分割
说明:
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater
than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example, Given 1->4->3->2->5->2 and x = 3, return 1->2->2->4->3->5.
#include <stdio.h>
#include <stdlib.h>
typedef struct _LinkNode{
int data;
struct _LinkNode *next;
}LinkNode;
typedef struct _LinkList{
LinkNode *head;
int length;
}LinkList;
//初始化
LinkList *Init()
{
//创建链表
LinkList *list=(LinkList*)malloc(sizeof(LinkList));
//创建链表节点
LinkNode *node=(LinkNode*)malloc(sizeof(LinkNode));
//初始化
list->head=node;
node->data=0;
node->next=NULL;
list->length=0;
return list;
}
//插入
void Insert(LinkList *list,int pos,int data)
{
//合法性检验
if(list==NULL)
return ;
if(pos>list->length)
pos=list->length;
//创建辅助节点
LinkNode *pCurrent=list->head;
//找到pos的前一个位置
int i=0;
for(i=0;i<pos;i++)
{
pCurrent=pCurrent->next;
}
//创建新节点
LinkNode *newnode=(LinkNode*)malloc(sizeof(LinkNode));
newnode->data=data;
newnode->next=NULL;
//插入节点
newnode->next=pCurrent->next;
pCurrent->next=newnode;
list->length++;
}
//打印
void Print(LinkList* list)
{
//合法性检验
if(list==NULL)
return;
//创建辅助节点
LinkNode *pCurrent=list->head->next;
//遍历打印
int i=0;
for(i=0;i<list->length;i++)
{
printf("%2d",pCurrent->data);
pCurrent=pCurrent->next;
}
}
//链表释放
void Free(LinkList *list)
{
if(list==NULL)
return;
//创建辅助接点
LinkNode *pCurrent=list->head->next;
LinkNode *now=NULL;
while(pCurrent!=NULL)
{
now=pCurrent->next;
free(pCurrent);
pCurrent=now;
}
list->head->next=NULL;
list->length=0;
}
//销毁链表
void Destroy(LinkList *list)
{
if(list==NULL)
return;
Free(list);
if(list->head!=NULL)
free(list->head);
free(list);
}
//分割链表,小于data的节点在左边,大于或等于data的节点在右边,分割两段的原顺序保存不变
void Partition(LinkList *list,LinkList *llist1,int data)
{
//辅助接点
LinkNode *pCurrent=list->head->next;
//辅助链表
LinkList *rlist1=Init();
//遍历,把小于data节点数据存入链表llist1,不小于的存入临时链表rlist1;
while(pCurrent!=NULL)
{
if(pCurrent->data < data)
{
Insert(llist1,llist1->length,pCurrent->data);
}
if(pCurrent->data >= data)
{
Insert(rlist1,rlist1->length,pCurrent->data);
}
pCurrent=pCurrent->next;
}
//遍历,将临时链表的数据存入链表llist1
pCurrent=rlist1->head->next;
while(pCurrent!=NULL){
Insert(llist1,llist1->length,pCurrent->data);
pCurrent=pCurrent->next;
}
//销毁临时链表
Destroy(rlist1);
}
int main()
{
//创建链表
LinkList *list=Init();
LinkList *list1=Init();
//插入数据
Insert(list,0,2);
Insert(list,0,5);
Insert(list,0,2);
Insert(list,0,3);
Insert(list,0,4);
Insert(list,0,1);
//打印
Print(list);
printf("\n");
//分割链表
Partition(list,list1,3);
Print(list1);
//销毁链表
Destroy(list);
Destroy(list1);
return 0;
}