链表相关问题总结

链表相关问题

链表问题一般通过维护多个节点的指针,在链表中穿针引线来进行解决。另外一个常用的技巧就是通过创建一个虚拟头结点(主要用于头结点可能被改变的场景之下),使之连接到节点中

//
// Created by yzm on 12/3/18.
//
#include <iostream>
using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};//链表问题没有特殊说明,不能改变链表中的值/*** 206.翻转链表* */
class Solution1 {public:ListNode* reverseList(ListNode* head) {ListNode *pre = nullptr;ListNode *next = nullptr;while ((head != nullptr)){next = head->next;head->next = pre;pre = head;head = next;}return pre;}//用类似第二提的方法左超 出时间限制ListNode* reverseList2(ListNode* head) {if(head == nullptr||head->next == nullptr)return head;ListNode dummy(-1);dummy.next = head;ListNode *pre = &dummy;pre = head->next;ListNode *cur = pre->next;while(cur->next != nullptr) {pre->next = cur->next;cur->next = head->next;head->next = cur;//头插法cur = pre->next;}return dummy.next;}
};/*** 92.翻转链表2* 方法:穿针引线法* *///此方法左时间太长
class Solution2 {public:ListNode* reverseBetween(ListNode* head, int m, int n) {ListNode dummy(-1);dummy.next = head;ListNode *pre = &dummy;for(int i = 0; i < m-1; i++)pre = pre ->next;ListNode* const head2 = pre;pre = head2->next;ListNode *cur = pre->next;for(int i = m; i < n;i++) {pre->next = cur->next;cur->next = head2->next;head2->next = cur;//头插法cur = pre->next;}return dummy.next;}};
/*** 83,删除排序表中重复元素,注意是有序的,就比较好办了* */
class Solution3 {public://递归版本实现,画出递归数ListNode* deleteDuplicates(ListNode* head) {if(head == nullptr)return head;ListNode dummy(head->val+1);dummy.next = head;recur(&dummy,head);return dummy.next;}void static recur(ListNode* pre,ListNode* cur){if(pre == nullptr)return;if(pre->val == cur->val ){pre->next = cur->next;delete cur;recur(pre,pre->next);} else{recur(pre->next,cur->next);}}//迭代版本,比递归版本要慢很多ListNode* deleteDuplicates2(ListNode* head) {ListNode* curNode = head;while (curNode != NULL&& curNode->next != NULL) {// 如果当前节点的val和下一节点的val相等,那么将当前节点链接到下下个节点,意思就是抛弃了相同的下一个节点if (curNode->val == curNode->next->val) {curNode->next = curNode->next->next;}else {    // 否则就是下一节点和当前节点不相同,那么curNode移位curNode = curNode->next;}}return head;}
};/*** 86.分隔链表*给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。* */
class Solution4 {public://我这种仅仅只是把相关的数进行ListNode* partition(ListNode* head, int x) {if(head == nullptr)return head;ListNode dummy(head->val-1);dummy.next = head;ListNode* pre = &dummy;ListNode *temp = nullptr;while (head != nullptr&&head->next != nullptr){if(head->val < x){pre = head;head = head ->next;} else{temp = head->next;pre ->next = head->next;head->next =temp->next;head = pre ->next;}}return dummy.next;}ListNode* partition2(ListNode* head, int x) {ListNode* res = new ListNode(0);res->next = head;ListNode* smallCurNode = res;ListNode* bigHead = new ListNode(0);ListNode* bigCurNode = bigHead;ListNode* curNode = head;while (curNode != NULL) {// 小于x,链接到小段if (curNode->val < x) {smallCurNode->next = new ListNode(curNode->val);smallCurNode = smallCurNode->next;}else {  // 不小于x,链接到大段bigCurNode->next = new ListNode(curNode->val);bigCurNode = bigCurNode->next;}curNode = curNode->next;}// 两个段链接起来smallCurNode->next = bigHead->next;return res->next;}};
/***328.奇偶链表* 思路: 和上一道题相似,但是要在原来的空间里的相应节点做后继指针的跳变,同理,还是记录好偶数的头结点,* 然后奇偶列表分别做各自的连接,待循环完成,将奇偶列表链接起来,维护好奇偶列表最后一个节点的额指针变量* */class Solution5 {public:ListNode* oddEvenList(ListNode* head) {if (head == NULL || head->next == NULL)return head;ListNode* oddTail = head;ListNode* evenTail = head->next;ListNode* evenHead = evenTail;while (evenTail != NULL && evenTail->next!=NULL) {// 偶数段后继节点为奇数,所以奇数段连接到此节点oddTail->next = evenTail->next;// 奇数段tail后移oddTail = oddTail->next;// 偶数段后继节点连接至下一个偶数节点evenTail->next = oddTail->next;// 偶数段tail后移evenTail = evenTail->next;}// 奇数段和偶数段连接oddTail->next = evenHead;return head;}
};
/*** 2.两数相加* */
class Solution6 {public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* curL1 = l1;ListNode* curL2 = l2;ListNode* res = new ListNode(0);ListNode* head = res;int inHeight = 0;   // 进位while (curL1 != NULL || curL2 != NULL || inHeight != 0) {int numL1 = 0;        // l1当前位的值int numL2 = 0;       // l2当前位的值if (curL1 != NULL) {numL1 = curL1->val;curL1 = curL1->next;      // 循环变量维护}if (curL2 != NULL) {numL2 = curL2->val;curL2 = curL2->next;      // 循环变量维护}// 计算当前位的数字int numNow = numL1 + numL2 + inHeight;// 计算进位inHeight = numNow / 10;// 得到当前位的最终数字numNow = numNow % 10;// 循环变量维护res->next = new ListNode(numNow);res = res->next;}return head->next;}
};
/*** 203. 删除链表中的节点* */class Solution7 {public:ListNode* removeElements(ListNode* head, int val) {ListNode *dummmyHead = new ListNode(0);dummmyHead->next = head;ListNode *curNode = dummmyHead;while (curNode->next != NULL) {if (curNode->next->val == val) {ListNode *delNode = curNode->next;curNode->next = curNode->next->next;delete delNode;} elsecurNode = curNode->next;}return dummmyHead->next;}
};/*** 21.合并两个有序链表* 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。* */class Solution8 {public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode* dummmyHead = new ListNode(0);ListNode* curNode = dummmyHead;ListNode* curNodeL1 = l1;ListNode* curNodeL2 = l2;while (curNodeL1 != NULL || curNodeL2 != NULL) {// mergeif (curNodeL1 == NULL) {curNode->next = new ListNode(curNodeL2->val);curNode = curNode->next;curNodeL2 = curNodeL2->next;}else if (curNodeL2 == NULL) {curNode->next = new ListNode(curNodeL1->val);curNode = curNode->next;curNodeL1 = curNodeL1->next;}else if (curNodeL1->val <= curNodeL2->val) {curNode->next = new ListNode(curNodeL1->val);curNode = curNode->next;curNodeL1 = curNodeL1->next;}else {curNode->next = new ListNode(curNodeL2->val);curNode = curNode->next;curNodeL2 = curNodeL2->next;}}return dummmyHead->next;}
};
/*** 24. 两两交换链表中的节点*给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。* */
class Solution9 {public:ListNode* swapPairs(ListNode* head) {ListNode* dummmyHead = new ListNode(0);dummmyHead->next = head;ListNode* pre = dummmyHead;// pre的后继两个节点都有值才需要翻转,不都有值那么不需要操作了while (pre->next && pre->next->next) {ListNode* node1 = pre->next;ListNode* node2 = node1->next;ListNode* next = node2->next;pre->next = node2;node2->next = node1;node1->next = next;pre = node1;}return dummmyHead->next;}
};

leetcode链表问题相关推荐

  1. LeetCode——链表

    LeetCode--链表 目录 概述 找出两个链表的交点 链表反转 归并两个有序的链表 从有序链表中删除重复节点 删除链表的倒数第n个节点 交换链表中的相邻节点 链表求和 回文链表 分隔链表 链表元素 ...

  2. 面试官系列 - LeetCode链表知识点题型总结

    文章目录 前言 知识点 什么是链表 类别 单向链表 循环链表 双向链表 双向循环链表 与数组的性能对比 优缺点 常用技巧 题型总结 基本操作 删除类 翻转类题型 合并链表 环形链表 拆分链表 排序链表 ...

  3. dummy节点——leetcode链表题必备

    做leetcode链表题的时候,需要额外考虑链表头部的特殊情况.但是,往往考虑不够周全,导致最后通过不断试错,修改代码.代码变得臃肿,可读性差. 其实,引入一个dummy节点就可以解决大部分需要考虑头 ...

  4. 为了OFFER,花了几个小时,刷下Leetcode链表算法题

    @Author:Runsen @Date:2020/9/13 链表是我这辈子的痛啊,每次学到链表,就往往不会,就没有继续学下去.现在大四不能继续让这个链表阻碍我了.现在基本是重刷数据结构和算法,毕竟笔 ...

  5. leetcode(链表专题)

    数组模拟链表 #include<iostream> using namespace std;const int N = 100; // 单链表 // head存储链表头,e[]存储节点的值 ...

  6. LeetCode 链表相关题目总结

    之前已经对链表相关常用操作进行了总结.在这里,对 LeetCode 与链表相关的题目解答思路进行总结. 1. 两个链表,求是否有相交的节点并返回 方案一:将两个链表的各节点依次存入两个对象中,然后双层 ...

  7. leetcode链表题(大致是由易到难

    链表系列 leetcode237删除节点 86分隔链表. 剑指 Offer 06. 从尾到头打印链表 解法1:常规 解法2:栈 解法3:用头插法对链表进行逆置 剑指 Offer 24. 反转链表 第一 ...

  8. 链表OJ无从下手??磕磕绊绊终于AC却不知其所以然???这篇文章带你刷穿Leetcode链表题!

    一.前言 学完了链表的基础知识,是时候用一些OJ题目来练练手了!但是我们不仅仅要追求AC,还要能够总结提炼相关的思想方法.在本文中作者将运用虚拟头结点+递归+双指针三种技巧,逐题精讲常见常考的链表OJ ...

  9. 假设以带头结点的循环链表表示队列_[leetcode链表系列]2 删除链表中的节点

    复习链表的插入 链表的一个节点是由数据域和指针域构成,指针域的地址值为下个元素的地址.那么我们需要插入或者删除一个元素怎么处理呢? 先查看原始链表结构,准备将结点x插入链表中. 此时我们需要先保存n节 ...

  10. 使用循环链表实现一个通讯录的管理程序_【LeetCode链表题型总结】

    点击上方蓝字,关注公众号 链表概念的讲解 链表是什么 链表是一种线性数据结构,每个节点都存有数据,通过指针将各个节点链接在一起. 链表的性质 一致性: 每个节点有相同的数据结构,相同的数据大小,内存中 ...

最新文章

  1. yolov5 face 使用踩坑记录
  2. 1、操作系统基础概念
  3. django 类取消csrf_Django之Form组件详解、图片上传及定制
  4. centos oracle创建库,CentOS Oracle安装必要的软件创建数据库
  5. netty 多线程微盘_Netty多线程处理机制
  6. java jtable 监听_【Java】在JTable中设置鼠标监听器,点击操作对应数据
  7. 多国电子书盈利模式分析
  8. HTML5技术的调研以及贴吧应用总结
  9. java 同步线程方式
  10. android四大基本布局,四大布局 使用详解
  11. wow服务器人口普查哪个网站,魔兽世界wow官方的人口普查在哪里查询_魔兽世界wow人口普查数据到底是多少_快吧游戏...
  12. Excel中不复制隐藏行
  13. linux关闭firefox进程,Firefox 68+ 怎样关闭多进程
  14. Three导入dae格式模型实例
  15. QsciScintilla等编辑器实现不同区域鼠标右键处理方式不同的方法
  16. SpringBoot初试错误合集
  17. bmp180气压传感器工作原理_【科普】40种传感器工作原理
  18. 排序?吹泡泡吹到排序
  19. 早餐吃得好,血管更通畅!4种食物都是不错的选择,远离心血管病
  20. 【JNU】网络配置大题详解(E口与G口两种类型)

热门文章

  1. django框架搭建详细步骤
  2. java评测软件,Cena代码评测软件系列之二:评测Java代码
  3. 隐马尔可夫模型(《统计学习方法》、python实现)
  4. Axure制作可视化图表最快的方法
  5. 基于Java+SpringMVC+vue+element宠物管理系统设计实现
  6. DockerFile---构建docker镜像的文件
  7. tinyxml2 01 基本使用
  8. DevExpress VCL 一键安装工具
  9. Codeforces 1000D Yet Another Problem On a Subsequence 【dp】【组合数学】
  10. Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具