单链表插入排序算法

约定不等于承诺〃 2022-08-26 12:15 284阅读 0赞

如果数据存储在一段连续的内存上,比如数组中,插入排序算法的实现相信大家都已经非常熟悉,如果要对一个单链表进行插入排序,将会牵扯到大量指针操作。

同时,如果在实现的过程中适当使用一些小技巧,将会减少指针操作的次数,同时也减少出错的危险。

插入排序的原理相信大家都已经了然于胸,这里就不在赘述,下面直接给出实现代码:

如有错误之处,还望不吝指教,共同学习进步:

  1. #include <iostream>
  2. using namespace std;
  3. struct ListNode {
  4. int val;
  5. ListNode *next;
  6. ListNode(int x) : val(x), next(NULL) {}
  7. };
  8. class Solution {
  9. public:
  10. ListNode *insertionSortList(ListNode *head) {
  11. if (!head) return NULL ;
  12. ListNode* preHead = new ListNode(INT_MIN) ; //作为哨兵节点
  13. preHead->next = head ;
  14. head = preHead ;
  15. ListNode* p1 = head->next ;//指向要进行插入排序的节点的前一个节点
  16. ListNode* p2 = head ; //指向插入位置的前一个节点
  17. while(p1 ->next != NULL)
  18. {
  19. p2 = head ;
  20. while (p2->next != p1->next && p1->next->val > p2->next->val)
  21. p2 = p2->next ;
  22. if (p2->next != p1->next)
  23. {
  24. ListNode* tmpP1 = p1->next ;
  25. p1->next = p1->next->next ;
  26. tmpP1->next = p2->next ;
  27. p2->next = tmpP1 ;
  28. }
  29. else
  30. p1 = p1->next ; //不交换的时候才移动p1指针,否则不移动
  31. }
  32. preHead = head ;
  33. head = head->next ;
  34. delete preHead ;
  35. return head ;
  36. }
  37. };
  38. int main(int argc, char **argv)
  39. {
  40. ListNode *head = NULL ;
  41. ListNode *tail = NULL ;
  42. int n ;
  43. //输入数据
  44. while (cin >> n)
  45. {
  46. ListNode *newNode = new ListNode(n) ;
  47. if (head == NULL)
  48. {
  49. head = newNode ;
  50. tail = newNode ;
  51. }
  52. else
  53. {
  54. tail->next = newNode ;
  55. tail = newNode ;
  56. }
  57. }
  58. //插入排序
  59. Solution s ;
  60. head = s.insertionSortList(head) ;
  61. //输出排序结果
  62. ListNode* p = head ;
  63. while(p != NULL)
  64. {
  65. cout << p->val << " " ;
  66. p = p->next ;
  67. }
  68. cout << endl ;
  69. //删除空间
  70. p = head ;
  71. while (p)
  72. {
  73. ListNode* tmp = p ;
  74. p = p->next ;
  75. delete tmp ;
  76. }
  77. return 0 ;
  78. }

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读

    相关 插入排序算法

    如果数据存储在一段连续的内存上,比如数组中,插入排序算法的实现相信大家都已经非常熟悉,如果要对一个单链表进行插入排序,将会牵扯到大量指针操作。 同时,如果在实现的过

    相关 的归并排序插入排序

    由于最近在学习数据结构和算法,在牛客网 的在线编程题上遇到了对链表的相关排序操作,发现自己对链表这块还是理解不够深入,以前做过对数组进行排序,但链表的操作要比数组复杂一些,毕竟

    相关 排序

    算法思想:采用直接插入排序算法的思想,先构成只含一个数据结点的有序单链表,然后一次扫描剩下的结点p(直至p==NULL为止),在有序表中通过比较查找插入p的前驱结点pre,然后