前面分享了双指针移动实现插入排序,第一个指针pre的作用是为了插入数据节点,第二个指针prel作用是和待插入的数据节点进行比较,今天分享只用一个指针实现链表的插入排序。
需要注意的只有一点指针必须在比较的数据节点之前,这样才能实现交换内存地址,从而实现插入功能。
关于图,请大家看前面的双指针实现链表插入排序的博文,只需要将prel这个指针删除掉就行
直接分享核心代码
node *q,*p, *pre; //q指针指向待插入的数据节点,pre指向被比较的数据节点前面一个节点 q = head->next->next; //q指向第二个数据节点,实现将一个链表拆分成两个链表 head->next->next = NULL;//实现拆分成两个链表 while (q != NULL) //循环条件,当没有数据节点需要插入为止 { p = q->next; //将下一个待插入的数据节点的地址给p pre = head; //pre指向头节点 while (pre->next !=NULL && pre->next->a < q->a)//两个条件:第一个条件如果不成立说明待插入的数最大,这时候pre指向最后一个数据节点。第二个条件不成立,说明待插入的数据比被比较的数据小,应该插入到被比较的节点的前面,这时候pre指向数据节点的前面一个节点 pre = pre->next; //满足两个条件就继续移动pre指向下一个数据节点继续和待插入节点比较 q->next = pre->next;//下面两行实现节点的插入 pre->next = q; q = p; //通过p让q指向下一个数据节点继续插入 }