今天看到顺序表的插值排序,所以研究了一下,想在链表上用直接插入排序。
总的思想:最前面的一个数据节点则默认为有序,那么后面的n-1个数据节点为无序。将无序的节点一个一个插到有序链表合适的位置中,直到所有的节点都插完,就可形成一个有序链表。
具体方法:
首先创建链表:
//Link List structure
typedef struct node
{
int Data;
struct node *next;
}LinkList;
// create linklist
LinkList *head, *pNode;
head = NULL;
int Data = 0;
while ( Data < 9 )
{
LinkList *pNode = new LinkList();
pNode->Data = rand()%10;
pNode->next = head;
head = pNode;
Data = Data + 1;
}
Data = 0;
//注意这里不能直接使用head->next,它会移动指针
pNode = head;
while(Data < 9)
{
printf("%d n", pNode->Data);
pNode = pNode ->next;
Data = Data + 1;
}
下面开始排序:
第一步、、判断是否只有一个头节点或者只有一个数据节点?
如果是的话,那当然就不用排序了。因为已经成有序了。
Link Sort(Link Head)
{//我创建的是带头节点的链表。
if(!Head->next||!Head->next->next)//此步条件判断非常有价值。
return Head;
第二步:既然有多个数据节点,那就要排序了。此步做初始工作:先将一个整个链表分成一个有序链表和一个无序链表。如图形式2。
Link Sort(Link Head)
{//我创建的是带头节点的链表。
if(!head->next||!head->next->next)//此步条件判断非常有价值。
return Head;
ptr=head->next->next;
ptr_F=head;
head->next->next=NULL;//到此,分成了两个链表。
第三步:现在正式开始!(此步骤需要注意:不要让后面的无序链表断了,找不着了。)
Link Sort(Link Head)
{//我创建的是带头节点的链表。用直接插入法。
if((head->next==NULL)||(nead->next->next==NULL))//此步条件判断非常有价值。
{
cout<<"数据节点数少于2个,不用排序!"<<endl;
return Head;
}
//-----------第二步;
Link ptr;
Link ptr_F;
Link ptr_N;
ptr=nead->next->next;
ptr_F=Head;
head->next->next=NULL;//到此,分成了两个链表。
//第三步。
while(ptr)
{
ptr_N=ptr->next;
ptr_F=head;//ptr_F的归位。
while(ptr_F->next)
{
if(ptr->Data>ptr_F->next->Data)
{
ptr->next=ptr_F->next;
ptr_F->next=ptr;
break;
}
else
{
if(ptr_F->next->next )
ptr_F = ptr_F->next;
else
{
ptr->next = ptr_F->next->next;
ptr_F->next->next = ptr;
break;
}
}
}
ptr = ptr_N;
}
}//while(ptr)
cout<<"从高到低,排序成功!"<<endl;
return Head;
}
反转链表分两种方法,循环算法和递归算法,其中递归算法如下:
Linklist* resverse(Linklist *l)
{
if(l == NULL || l->pNext == NULL)
return l;
Linklist *n = resverse(l->pNext);
l->pNext->pNext = l;
l->pNext = NULL;
return n;
}
--转自