一些简单的链表算法二
下面的算法是稍微有点难度的
1、在一个给定的已按升序排列的链表插入一个给定的节点
void SortedInsert(LIST**headRef,LIST*newNode)
{
if(*headRef == 0 || (*headRef)->data >= newNode->data)
{
newNode->next = *headRef;
*headRef = newNode;
}
else
{ LIST *current = *headRef;
while(current->next != 0 && current->next->data < newNode->data)
{
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}
2、将给定的链表按升序排列
void InsertSort(LIST**headRef)
{
LIST* result = 0;
LIST* next = 0;
LIST* current = *headRef;
while(current != 0)
{ next = current->next;
SortedInsert1(&result,current);
current = next;
}
*headRef = result;
}
3、将给定的两个链表连接起来
void Append(LIST**headRefa,LIST**headRefb)
{
LIST* current = *headRefa;
if(current == 0)
{
*headRefa = *headRefb;
}
else
{
while(current->next != 0)
{
current = current->next;
}
current->next = *headRefb;
}
*headRefb = 0;
}
4、将链表分成前后两个链表,如果有奇数个节点则前面比后面多一个
void FrontBackSplit(LIST** head,LIST**a,LIST**b)
{
int len = Length(*head);
LIST* current = *head;
*a = *head;
*head = 0;
if(len % 2 == 0)
{
if(len == 0)
{
*b = 0;
return;
}
else
{ len = len/2;
while(--len)
{
current = current->next;
}
}
}
else
{
len = len/2;
while(len--)
{
current = current->next;
}
}
*b = current->next;
current->next = 0;
}
5、将一个按升序排列的链表的重复元素删除
void RemoveDuplicates(LIST* head)
{
if(head == 0)
return;
else
{
LIST*current1 = head;
LIST*current2 = current1->next;
while(current1 != 0 && current2 != 0)
{
if(current2->data == current1->data)
{
current1->next = current2->next;
delete(current2);
current2 = current1->next;
}
else
{
current1 = current1->next;
current2 = current2->next;
}
}
}
}
6、将一个链表的第一个元素插入到另一个链表的头部
void MoveNode(LIST**destRef,LIST**sourceRef)
{
assert(*sourceRef);
LIST *current = *sourceRef;
*sourceRef = current->next;
current->next = *destRef;
*destRef = current;
}

浙公网安备 33010602011771号