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

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

25


image.png

  • 要求时间复杂度O(1),所以很多取巧暴力的方法就不能用了
  • 我们需要把链表均分为两份,然后重新排列,所以需要先找到中间结点
  • 链表找中间节点有一种固定使用的方法,就是快慢指针
  • 设置两个指针p和q,p每次走一步,q每次走两步
  • 当指针q到达链表尾时,p就正好在链表中间(可以自己画一个图,非常好理解)
  • 从中间结点断开,分成两个链表
  • 然后将后一个链表也就是原链表的后半段进行原地逆置
  • 最后分别插入即可
  • 时间复杂度O(n),空间复杂度O(1)


void rearrange(NODE *head) {
  NODE *p = head, *q = head, *tmp, *s;
  // 1.快慢指针,找到中间结点
  while(q->next != NULL) {
    p = p->next;
    q = q->next;
    if(q->next != NULL) q = q->next;
  }
  // 2.断链,分成两个链表
  q = p->next;
  p->next = NULL;
  // 3.后一个链表原地逆置,链回去
  while (q != NULL) {
    tmp = q->next;
    q->next = p->next;
    p->next = q;
    q = tmp;
  }
  // 4.拼接两个链表
  s = head->next;
  q = p->next;
  p->next = NULL;
  while (q != NULL) {
    tmp = q->next;
    q->next = s->next;
    s->next = q;
    s = q->next;
    q = tmp;
  }
}
复制代码


  • 思路就是要插入逆置的后半部分的链表,而逆置后半部分就需要先找到中间结点,找中间结点就要用到快慢指针

链表已经更新完毕,5月继续更新栈和队列👨‍💻


更新日志


  • 2022年4月7日 开始
  • 4月12日 顺序表更新完成
  • 4月25日 更新整个目录结构为中文,之后的提交信息也换成中文
  • 4月28日 链表更新完成
  • ...
目录
相关文章
|
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