408王道数据结构课后代码习题(XVI)

简介: 408王道数据结构课后代码习题(XVI)

19


image.png


  • 遍历循环单链表,每循环一次查找一个最小结点(循环单链表,注意循环终止条件!)
  • minp指向最小值结点,minpre指向其前驱
  • 输出其值然后删除,循环结束后释放头结点
  • 时间复杂度O(n2),空间复杂度O(1)


void delMin(LinkList L) {
  // 1.创建工作指针,遍历
  LNode *p, *pre, *minp, *minpre;
  while (L->next != L) {
    pre = L, p = L->next;
    minpre = pre, minp = p;
    // 2.找到最小值,记录其前缀
    while (p != L) {
      if (p->data < minp->data) {
        minp = p;
        minpre = pre;
      }
      pre = p;
      p = p->next;
    }
    // 3.输出并释放最小值结点
    cout << minp->data << ' ';
    minpre->next = minp->next;
    free(minp);
  }
  // 4.释放头结点
  free(L);
}
复制代码


  • 每次删除最小值结点,我们只需要记录最小值前缀即可
  • 每次都用 minpre->next 进行比较
  • 时间复杂度O(n2),空间复杂度O(1)


void delMin2(LinkList L) {
  // 1.只剩一个头结点时停止
  while (L->next != L) {
    LNode *minpre = L, *p = L->next;
    // 2.找到最小值,记录其前缀
    while (p->next != L) {
      if (p->next->data < minpre->next->data)
        minpre = p;
      p = p->next;
    }
    // 3.输出并释放最小值结点
    cout << minpre->next->data << ' ';
    LNode *del = minpre->next;
    minpre->next = del->next;
    free(del);
  }
  // 4.释放头结点
  free(L);
}
复制代码


  • 如果只考虑输出的话,有一个取巧的方法
  • 我们把链表的值取出来放在一个数组中排序输出
  • 最后释放链表空间即可
  • 用了cpp的 sort() ,所以时间复杂度O(nlog2n),空间复杂度O(n)


int getLength(LinkList L) {
  int i = 0;
  LNode *p = L->next;
  while (p != L) {
    p = p->next;
    i++;
  }
  return i;
}
void delMin3(LinkList L) {
  int len = getLength(L);
  int a[len], i = 0;
  LNode *head = L->next;
  while (head != L) {
    a[i++] = head->data;
    head = head->next;
  }
  sort(a, a+len);
  for (int i = 0; i < len; i++)
    cout << a[i] << ' ';
  puts("");
  // 释放所有结点空间,此处省略
}


目录
相关文章
|
11天前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
11天前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
5天前
|
算法
数据结构和算法常见的问题和代码
数据结构和算法常见的问题和代码
|
15天前
|
存储 机器学习/深度学习 缓存
【数据结构】布隆过滤器原理详解及其代码实现
【数据结构】布隆过滤器原理详解及其代码实现
|
22天前
|
算法 C语言
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
11 0
|
22天前
|
算法 C语言
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
12 0
|
22天前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
14 0
|
22天前
|
算法 Shell C语言
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
15 0
|
22天前
|
人工智能 算法 C语言
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
17 0
|
22天前
|
算法 C语言
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
15 0