Sort a linked list using insertion sort.
Subscribe to see which companies asked this question
解答
对于链表的插入排序,用tmp_tail遍历链表,每次的待插入数是tmp_tail->next的元素,待插入数必须从头开始比较,当然从头开始比较时要注意处理待排序数小于或等于链表首元素的情况,因为插入在链表的首元素之前与一般情况的插入不同,而如果待插入数插入在它之前的数列中,则用于遍历链表的指针tmp_tail不需要移动,这与数组不同,毕竟数组插入时是要将部分数组元素整体移动的,而链表不需要,将待插入数插入在前面的链表中后tmp_tail的下一个数就是待排序数,但是如果待插入数保持原位不动,则需要将tmp_tail后移一个,因为新的待插入数是原先待插入数的下一个数,判断待插入数是否在原位只需要在遍历结束后判断tmp_tail->next是否等于tmp_node(待插入数)即可。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* insertionSortList(struct ListNode* head) { struct ListNode *tmp_node, *tmp_head, *tmp_tail = head; if(NULL == tmp_tail){ return head; } while(NULL != tmp_tail->next){ tmp_node = tmp_tail->next; if(head->val >= tmp_node->val){ tmp_tail->next = tmp_node->next; tmp_node->next = head; head = tmp_node; } else{ tmp_head = head; while(tmp_node != tmp_head->next){ if(tmp_head->next->val < tmp_node->val){ tmp_head = tmp_head->next; } else{ tmp_tail->next = tmp_node->next; tmp_node->next = tmp_head->next; tmp_head->next = tmp_node; break; } } if(tmp_tail->next == tmp_node){ tmp_tail = tmp_tail->next; } } } return head; }