目录

反转单链表

反转部分单链表

K个一组反转单链表

K个一组反转单链表(从尾结点开始)


反转单链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点

输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL

class Solution {
public:ListNode* reverseList(ListNode* head) {if(head == NULL || head->next == NULL)return head;ListNode *cur = head;ListNode *pre = NULL;ListNode *tmp = NULL;while(cur){tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;}
};

反转部分单链表

反转left到right部分的链表节点


class Solution {
private:void reverseLinkedList(ListNode *head) {// 也可以使用递归反转一个链表ListNode *pre = nullptr;ListNode *cur = head;while (cur != nullptr) {ListNode *next = cur->next;cur->next = pre;pre = cur;cur = next;}}
public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论ListNode *dummyNode = new ListNode(-1);dummyNode->next = head;ListNode *pre = dummyNode;// 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点// 建议写在 for 循环里,语义清晰for (int i = 0; i < left - 1; i++) {pre = pre->next;}// 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点ListNode *rightNode = pre;for (int i = 0; i < right - left + 1; i++) {rightNode = rightNode->next;}// 第 3 步:切断出一个子链表(截取链表)ListNode *leftNode = pre->next;ListNode *curr = rightNode->next;// 注意:切断链接pre->next = nullptr;rightNode->next = nullptr;// 第 4 步:同第 206 题,反转链表的子区间reverseLinkedList(leftNode);// 第 5 步:接回到原来的链表中pre->next = rightNode;leftNode->next = curr;return dummyNode->next;}
};

K个一组反转单链表

给出头结点,从前往后,不足k个的不反转

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {if (head == nullptr)    return head;ListNode* tail = head;for(int i = 0; i < k; ++i)  //先让tail移动k个节点{if(tail == nullptr) return head;tail = tail->next;}ListNode* cur = head, *pre = nullptr, *next = nullptr;while(cur != tail)      //注意: reverse[head, tail){next = cur->next;cur->next = pre;pre = cur;cur = next;}head->next = reverseKGroup(tail, k);  //@在本组中,head成为了最后一个节点,注意递归使用(tail, k)return pre;     //@返回翻转后的头结点}
};

K个一组反转单链表(从尾结点开始)

在上一个题的基础上,如果给定的是尾结点,从后开始反转。则:

你只需要先把单链表进行一次逆序,逆序之后就能转化为从头部开始组起了,然后按照我上面的解法,处理完之后,把结果再次逆序即搞定。两次逆序相当于没逆序。

链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。

class Solution {
public:ListNode* reverse1(ListNode* head){if(head == nullptr || head->next == nullptr)return head;ListNode* cur = head;ListNode* pre = nullptr;ListNode* tmp = nullptr;while(cur){tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;}ListNode* reverseKGroup1(ListNode* head, int k) {if (head == nullptr)    return head;ListNode* tail = head;for(int i = 0; i < k; ++i)  //先让tail移动k个节点{if(tail == nullptr) return head;tail = tail->next;}ListNode* cur = head, *pre = nullptr, *next = nullptr;while(cur != tail)      //注意: reverse[head, tail){next = cur->next;cur->next = pre;pre = cur;cur = next;}head->next = reverseKGroup1(tail, k);  //@在本组中,head成为了最后一个节点,注意递归使用(tail, k)return pre;     //@返回翻转后的头结点}ListNode* reverseKGroup(ListNode* phead, int k){ListNode* head = reverse1(phead);ListNode* tmp = reverseKGroup1(head, k);ListNode* res = reverse1(tmp);return res;}};

链表反转相关的题(C++模板)相关推荐

  1. C语言链表逆序复杂度为o1,C链表反转(时间复杂度O(n))

    面试的时候经常会出现的问题,现在都做一遍,回忆一下,练练手. 这个题目需要注意两点: 1.head->next 要先设置为NULL ,否则反转后,它还是指向之前的next节点 2.需要有一个tm ...

  2. 【数据结构】链表相关OJ题 (万字详解)

    文章目录 一.移除链表元素 二.反转链表 三.链表的中间节点 四.链表中倒数第K个节点 五.合并两个有序链表 六.分隔链表 七.回文链表 八.相交链表 九.环形链表 十.环形链表 II 十一.复制带随 ...

  3. 转载:看一遍就理解,图解单链表反转

    转载:看一遍就理解,图解单链表反转 看一遍就理解,图解单链表反转 前言 反转链表是程序员必备的基本素养,经常在面试.笔试的过程中出现.一直觉得反转链表实现代码不是很好理解,决定搬leetcode那道经 ...

  4. python实现链表反转(转置)

    python实现链表反转(转置) 链表是面试里面经常涉及到的考点,因为链表的结构相比于Hashmap.Hashtable.Concurrenthashmap或者图等数据结构简单许多,对于后者更多面试的 ...

  5. Interview:算法岗位面试—10.30上午上海某信息公司(偏图算法)技术面试之单链表反转、给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xcepti

    ML岗位面试:10.30上午上海某信息公司(偏图算法)技术面试之单链表反转.给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xception.推荐算法等 I ...

  6. 看一遍就理解,图解单链表反转

    前言 反转链表是程序员必备的基本素养,经常在面试.笔试的过程中出现.一直觉得反转链表实现代码不是很好理解,决定搬leetcode那道经典反转链表题出来,用十多张图去解析它,希望加深大家对链表反转的理解 ...

  7. java 链表反转_LeetCode206 实现单链表的反转

    LeetCode206 实现单链表的反转 LeetCode 码,码不停题 1.题目介绍 Reverse a singly linked list. Example: Input:1->2-> ...

  8. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  9. 链表反转leetcode206

    最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...

最新文章

  1. 栈和堆的区别(转 知乎)
  2. d3.json php,使用d3.json从PHP进行JSON输出
  3. java 获取绝对路径
  4. 北京通州拟3年培训技能人才5万人次 服务城市副中心行政办公区等
  5. 计算机网络实验二:应用层和传输层网络协议分析
  6. 如何在 Eclipse 中使用命令行
  7. python idle使用anaconda中库怎么用_如何使用Anaconda学习Python
  8. 【CodeForces - 1051C 】Vasya and Multisets (模拟)
  9. php定义object数据类型,PHP数据类型(4):对象object
  10. python使用BytesIO或StringIO读写文件
  11. java解析html_java中几种解析html的工具
  12. js中arguments的用法
  13. [简单分页]C#+JQUERY+ORACLE分页效果 ----转载
  14. 【vue】--利用vue-cli--搭建项目------1912--(另一个种)
  15. python3.4.3如何获取文件的路径
  16. 什么是 Power BI?
  17. linux自启动配置文件,linux 开机自启动设置
  18. csp 4-2 卖菜 (300 分)
  19. 冯唐:成大事者,必经的3个阶段
  20. c语言socket/smtp 邮件 附件,SMTP邮件传输协议发送邮件和附件 1

热门文章

  1. apple MacBook air m1是我认为最非常适合学生的笔记本
  2. 《Gpu Gems》《Gpu Pro》《Gpu Zen》资源收集
  3. C#中成员初始化顺序
  4. noj Nightmare
  5. Linux+DDoS deflate 预防DDoS
  6. Immutable-不变模式与不变类-一版
  7. Isilon三款新品构建数据湖2.0策略
  8. Openstack DashBoard:不能创建用户和配额的问题
  9. JS子元素oumouseover触发父元素onmouseout
  10. (转)在WCF服务的ServiceReferences.ClientConfig中使用相对路径