链表的实现

struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };

最基本的实现链表的左右孩子指针,以及构造函数

链表的使用

我在做题中的习惯,是首先申请一个head节点,记得要申请空间TreeNode* head = new TreeNode()当然通过《程序员面试宝典》中提到,指针是可以定义的时候不申请空间,让其没有指向,但是引用定义时要有确定的网址。这里的head是为了我们返回结果链表时的首地址,返回head->next

除了head,就是申请TreeNode* p;指针p用来遍历我们的结果链表,或者添加节点,类似于游标

如果是对于两个链表做运算,那么就是一个while(l1!=nullptr && l2!=nullptr),while运行结束,l1和l2至少有一个是遍历结束了,if(l1==nullptr){while (l2……)}
if(l2==nullptr){while (l1……)}

Leetcode 206 反转链表

反转一个单链表。

示例:

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

class Solution {public:ListNode* reverseList(ListNode* head) {stack<int> stack_list;ListNode* p ;ListNode* reverse = new ListNode();ListNode* cur = reverse;for(p = head; p!=nullptr; p = p->next){stack_list.push(p->val);}while(!stack_list.empty()){int value = stack_list.top();ListNode* node = new ListNode(value);reverse->next = node;reverse = reverse->next;stack_list.pop();}return cur->next;}
};

最简单的想法就是用一个栈遍历,再依次取出,构造结果链表。

这道题虽然简单,但是面试可能会问到,需要快速的写出答案,并且结果应该尽量简洁吧。

Leetcode官网给出的一种方法,可以节省空间的消耗。

class Solution {public:ListNode* reverseList(ListNode* head) {ListNode* prev = nullptr;ListNode* curr = head;while (curr) {ListNode* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;}
};

一共是三个指针在活动要分清。首先翻转是从我们获得的链表到链尾遍历,改变它的prev指针指向自己的上一个被遍历到的节点,也就是逆序,curr表示当前正在操作的节点。next指针保存当前节点的next指针。因为当前next指针要指向逆序prev,所以在改变next指针之前,先把当前的next保存下来,为了遍历原链表的下一个节点。

Leetcode 141 环形链表

给定一个链表,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

快慢指针法:

class Solution {public:bool hasCycle(ListNode *head) {if(head==NULL){return false;}ListNode *fast = head;ListNode *slow = head;while(fast->next!=NULL && slow->next != NULL && fast->next->next!=NULL){cout << "falst" << fast->val << "slow" << slow->val;fast = fast->next->next;slow = slow->next;if(fast==slow){return true;}}return false;}
};

Leetcode 287 寻找重复数

将链表的遍历顺序想象成一个跑到,如果快指针fast每次走两步,慢指针slow每次走一步,如果存在环,fast一定“扣圈”慢指针,在某一个位置相遇,这里判定的条件是地址,所以不用担心相同大小数字的干扰。

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。

解答:
这道题用哈希表非常容易可以找到答案。

官方同时也用到了环形链表的解法

class Solution {public:int findDuplicate(vector<int>& nums) {int slow = 0, fast = 0;do {slow = nums[slow];fast = nums[nums[fast]];} while (slow != fast);slow = 0;while (slow != fast) {slow = nums[slow];fast = nums[fast];}return slow;}
};

链表的建立是通过节点的值(数组的值,例如7),去连接索引为7的数组的值,nums[7]。因为存在重复数,一定会有环形链表,,通过使用快慢指针,找到环形的入口,也就是重复的值。但这里一直有个疑惑,如果出现nums[0] = 1, nums[1] = 0,两个指针只会在这两个数里面转,如何保证只存在由重复数组成的环,没怎么想明白。

C++ 链表 leetcode习题总结相关推荐

  1. JVAV学习小练习(一)之leetcode习题之接雨水

    leetcode习题之接雨水 一.题目描述 给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水.(图片是从leetcode拉过来的) ...

  2. 20190829:(leetcode习题)环形链表

    环形链表 题目 大致思路 代码实现 题目 大致思路 快慢指针法:fast指针比slow指针快一步,存在环时fast可以追上slow,最后指向相同,即可判断存在环. 递归法:每次都把指针指向自己,如果有 ...

  3. 20190828:(leetcode习题)回文链表

    回文链表 题目 大致思路 代码实现 题目 大致思路 对于本题,与之前的回文字符串相似,但是之前是反转字符串,现在是反转链表,我们直接用2个指针,分别来得到正序和反序的链表,逐元素进行对比,只要有元素不 ...

  4. 20190827:(leetcode习题)合并两个有序链表

    合并两个有序链表 题目 大致思路 代码实现 题目 大致思路 本题的思路来讲,可以想见是和数组之类的类似,每次取出一个最小的值,取n次之后得到新链,最容易想到递归方法.每次调用函数时得到新的ListNo ...

  5. 20190826:(leetcode习题)反转链表

    反转链表 题目 大致思路 代码实现 题目 大致思路 获取每一次的head,将其一个一个的放在新List的头部,并且将指针依次指向后续即可. 代码实现 public ListNode reverseLi ...

  6. 刷leetcode习题

    为什么要刷leetcode 面试笔试在leetcode上面抽题. 如何刷leetcode题 我的方法 1.写思路. 平时练leetcode题,先锻炼自己的思维能力,先把自己现阶段可以想到的做法都用注释 ...

  7. 顺序表链表 LeetCode专项练习 [19]\[24]

    题目列表: 19.删除链表的倒数第N个节点 24.两两交换链表中的节点 19. 删除链表的倒数第N个节点 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. ...

  8. [链表] --- 反转链表(leetcode 206)

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-&g ...

  9. 20191026(补):(leetcode习题)最长的斐波那契子序列的长度

    最长的斐波那契子序列的长度 题目 大致思路 代码实现 题目 给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度.如果一个不存在,返回 0 . 两个示例: 输入: [1,2 ...

最新文章

  1. Word2007怎样从随意页開始设置页码 word07页码设置毕业论文
  2. 跟技术大咖涨姿势!前沿CV技术+落地应用练就CV界的最强王者
  3. Dlib机器学习库安装
  4. C# 中的 null 包容运算符 “!” —— 概念、由来、用法和注意事项
  5. hashmap转红黑树的阈值为8_面试必考的 HashMap,这篇总结到位了
  6. 信息学奥赛一本通(2048:【例5.18】串排序)
  7. 解决Linux里面未启用网卡的问题
  8. ubuntu下修改用户的默认目录
  9. 京东金融品牌升级,为用户做精准决策,打造金融机构的“第二增长场景”
  10. 连接MYSQL数据库,报1130错误的解决方法
  11. 【持久层】Druid简介
  12. [软件更新]迅雷(Thunder)5.9.2.927版本发布
  13. 【MATLAB基础】数据作图--imagesc
  14. dell服务器运维,【产品鉴赏】戴尔DELL R710服务器
  15. 关于Ubuntu循环登陆界面
  16. oracle单引号和双引号用法
  17. ☀️光天化日学C语言☀️(31)- break 关键字 | 当断则断!
  18. PBN飞越转弯Flyover衔接TF、CF航段保护区组图
  19. 工况路普的采集与数据处理
  20. 从零开始搭建一个属于自己的网站

热门文章

  1. excel 字符串拼接_Python|处理字符串
  2. h5列表 php,H5的标签使用详解
  3. elasticsearch head插件(5.0及以上版本)
  4. css3的cursor
  5. 第一章:1-01、计算机网络的发展可划分为几个阶段?每个阶段各有何特点?
  6. 无限法则无法连接服务器内容,无限法则链接不了服务器
  7. 基础编程题目集 7-4 BCD解密 (10 分)
  8. 跨考计算机报班,考研跨考的经验总结与分享
  9. 嘉年华ON LINE首次在墨天轮和视频号并机直播,数据库内核技术抢先get
  10. 嘉年华回顾丨 杨长老带你解密 Oracle 19c 和 20c 的新特性