题目分析:
- 链表的插入排序实现。
解题思路:
两种方法实现
遍历实现
1)利用四个节点实现,其中一个节点指向当前带插入节点,一个节点指向带插入节点的下一个节点,一个节点记录待插入链表实际该插入位置的前一个元素,一个节点指向其带插入链表该插入位置的下一个节点;
2)遍历链表,每次先记录当前带插入节点的下一个节点,然后从有序链表的表头开始遍历查找,当出现逆序时,将此节点插入即可。
实现程序
//对链表执行插入排序 struct ListNode *insertionSortList(struct ListNode *head) { if (head == NULL) return NULL; if (head->next == NULL) return head; //建立一个虚初始节点 struct ListNode *temp = (struct ListNode *) malloc (sizeof(struct ListNode)); temp->next = head; struct ListNode *p = head->next; head->next = NULL; struct ListNode *r; struct ListNode *h1; struct ListNode *h2; while (p != NULL) { //记录下一个元素 r = p->next; h1 = temp->next; h2 = temp; //从前向后扫描比较进行插入 while (h1 != NULL) { //出现逆序,进行插入 if (h1->val > p->val) { h2->next = p; p->next = h1; break; } else { h1 = h1->next; h2 = h2->next; } } if (h1 == NULL) { h2->next = p; p->next = NULL; } p = r; } return temp->next; }