链表的插入排序
整体思路和数组插入排序差不多,不同的是查找方式略有不同
步骤如下:
1、从头至P(数组为从p往前找)找到p所指结点该插入的位置
2、若没合适位置,p往后走; 否则移动p
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
typedef struct ListNode LNode;
struct ListNode* insertionSortList(struct ListNode* head){
LNode *headNode=(LNode*)malloc(sizeof(struct ListNode));
headNode->next=head;
//由于oj的链表不带头节点,遂创一个头节点
head=headNode;
LNode *p=head->next; //工作指针
LNode *p_pre=head; //p的前驱指针
LNode *q,*q_pre; //从头比对指针以及前驱指针
while(p!=NULL){
q=head->next; //每一轮从头开始找
q_pre=head;
while(q!=p&&q->val<=p->val){ //从头至p找到val大于p->val的结点
q_pre=q;
q=q->next;
}
if(q==p){ //没找到的情况
p_pre=p;
p=p->next;
}
else{ //找到后把相应的指针调整,把p迁移在对p赋值回来
p_pre->next=p->next;
q_pre->next=p;
p->next=q;
p=p_pre->next;
}
}
head=head->next; //最后 删除头结点
free(headNode);
return head;
}
作者:zhu-lao-san-kuai-lai-a
链接:https://leetcode-cn.com/problems/insertion-sort-list/solution/lian-biao-cha-ru-pai-xu-by-zhu-lao-san-kuai-lai-a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:zhu-lao-san-kuai-lai-a
链接:https://leetcode-cn.com/problems/insertion-sort-list/solution/lian-biao-cha-ru-pai-xu-by-zhu-lao-san-kuai-lai-a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。