insertion-sort-list
链表插入排序(由小到大)。
输入:链表的头指针,
输出:排序后链表的头指针。
实现方法:将原链表拆成两部分:链表1仍以head为头指针,链表结点有序。链表2以head2为头指针,链表结点无序。
将链表2中的结点依次插入到链表1中,并保持链表1有序。
最后链表1中包含所有结点,且有序。
带头结点
ListNode* insertionSortList(ListNode* head) {
if(head == NULL||head->next == NULL) return head;
ListNode* newhead = new ListNode(0); //新建辅助头结点;
ListNode* p,*q,*pre;
p=head;
while(p!=NULL)
{
q = p->next; //记录下一个结点;
pre = newhead; //每次都遍历一次新链表;
while(pre->next != NULL && pre->next->val < p->val)
{
pre=pre->next;
}
p->next=pre->next;
pre->next=p;
p=q;
}
return newhead->next;
}
不带头结点
ListNode *insertionSortList(ListNode* head) {
if(head == NULL || head->next == NULL) return head;
ListNode* p ,*q, *pre, *post;
p = head->next;
head->next = NULL;
while(p != NULL)
{
q = p;
post = head;
while(post != NULL && post->val <= q->val)
{
pre = post;
post = post->next;
}
p = p->next;
if(post == head)
{
head = q;
}
else
{
pre->next = q;
}
q->next = post;
}
return head;
}

本文介绍了一种链表插入排序算法的两种实现方式:一种使用辅助头结点简化插入过程;另一种则直接操作原有链表。每种方法都详细展示了如何逐步将无序链表中的节点插入已排序的部分,并保持其有序性。
6525





