代码随想录第四天| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、160.链表相交、142.环形链表II
今天链表致死量
第一题

public static class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public static ListNode swapPairs(ListNode head) {
if(head==null){
return head;
}
ListNode dummyHead = new ListNode(-1,head);//定义虚拟头结点
ListNode pre = dummyHead;
ListNode cur = head;
ListNode temp = null;
while (cur!=null&&cur.next!=null){
pre.next = cur.next;
temp = cur.next.next;
cur.next = temp;
pre.next.next = cur;
//结束了,已经换过来了
pre = cur;
cur = cur.next;
}
return dummyHead.next;
}
- 算是自己做出来的第一道链表题,其实思路还是挺清晰的,就是三次交换的顺序写的不对,走了些弯路
- 主要还是借助debug,我慢慢觉得可以理解链表了,加油,今天又是努力爬出垃圾堆的一天!
第二题

public static ListNode removeNthFromEnd(ListNode head, int n) {
int len = 0;//链表的长度
ListNode x = head;
while (x!=null){
len ++;
x = x.next;
}
int index = len - n;
System.out.println(index);
ListNode dummyHead = new ListNode(-1, head);//虚拟头结点
ListNode cur = dummyHead;//从虚拟结点开始遍历
for (int i = 0; i < index; i++) {
cur = cur.next;
}
//此时cur就是要删除的元素的前一个元素
cur.next = cur.next.next;//删除
return dummyHead.next;
}
- 这题也太简单了叭,我是先一次遍历求出来链表的长度,再遍历来删除
- 进阶说让用一次遍历,看了题解还是双指针(快慢指针,也不是很难
- 就这还是中等题,这样的题麻烦再给我来一打,谢
第三题

public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null){
return null;
}
int lenA = 0;
ListNode cur = headA;
while (cur != null) {
lenA++;
cur = cur.next;
}//链表a的长度
int lenB = 0;
cur = headB;
while (cur != null) {
lenB++;
cur = cur.next;
}//链表b的长度
if (lenA > lenB) {
for (int i = 0; i < lenA - lenB; i++) {
headA = headA.next;
}
} else if (lenB > lenA) {
for (int i = 0; i < lenB - lenA; i++) {
headB = headB.next;
}
}
//上两步是保证两个链表尾部对齐
//此时两个指针应该都是指向公共部分的第一个位置
while (headA != null) {
if (headA != headB) {
headA = headA.next;
headB = headB.next;
}
else {
return headA;
}
}
return null;
}
- 这题是今天四题里唯一一道简单题,但我一开始真的卡了蛮久的,主要是不理解为什么下面这图的链表相交点不是1,

真的要看遍了网上所有讲解这题的视频,就发现我是在跟题目抬杠
简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。
- 后来迷过来之后就发现其实不难,就是找从哪开始这两个链表开始指向同一块区域的
- 这题没有加虚拟指针,因为如果两个链表的虚拟指针指向的地方都一样的话,他们就是同一个链表啊
- 我感觉做完这题我对链表的理解就更清晰了。谁是垃圾,平平无奇的链表小天才罢了
第四题

package list;
public class DetectCycle {
static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public static ListNode detectCycle(ListNode head) {
int pos = -1;//标志该链表是否为环形链表
// 快慢指针判断是否为环形链表
ListNode fast = head;
ListNode slow = head;
while (fast!=null&&fast.next!=null){
fast = fast.next.next;//快指针一次走两步
slow = slow.next;//慢指针一次走一步
if(fast==slow){
pos = 1;
break;
}
}
if(pos==-1){
return null;
}
//此时fast和slow指针都指向他们相遇的位
ListNode indexA = fast;//记录相遇的位置
ListNode indexB = head;//记录起始的位置
while (indexA!=indexB){
indexA = indexA.next;
indexB = indexB.next;//不相等的时候就各自往下走,总有一个时刻他们会相遇(这莫名的浪漫是怎么回事@_@
}
return indexA;
}
}
- 这题是今天没有想出来的题,就看了题解思路(午睡前看的),梦里想明白的,晚饭后实现的
- 突破口就是临界条件,本题涉及两个临界条件:
a)判断是否是环形链表:当快指针与慢指针相遇时,必是环形链表
b)找出环形链表的入口:x = z +(n-1)*(y+z) 【起始点到环形链表入口的距离 = 相遇点到环形链表入口的距离 + 任意个环形链表的长度 - 这题让我看到算法和数学的不同,数学题是没办法只通过临界条件来求解的
链表总结
- 我觉得这两天下来基本上把链表的结构掌握的差不多了,我发现我真的爱数据结构,明天的哈希表继续加油
- 不要害怕,之前老觉得没用过链表做题感觉不会,数组做完停了三天也没开链表,其实多练练就会了,加油吧宝贝
- 浅浅吐槽一下,链表也太难debug了叭,还有leetcode的这种模式,要想debug还要先还原题目内置的情景
代码随想录第四天| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、160.链表相交、142.环形链表II的更多相关文章
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II
[算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...
- 代码的鲁棒性:链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点.例如:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从 ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- 用四种方法将两个AJAX改为同步
用四种方法将两个AJAX改为同步 Promise.Generator函数.yield.async/await 相关 今有一题,题目为: 现有ajax1()和ajax2(),用于快速初始化CODE1和C ...
- [LeetCode] 24. 两两交换链表中的节点
题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是 ...
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
- Leetcode题库——24.两两交换链表中的节点
@author: ZZQ @software: PyCharm @file: swapPairs.py @time: 2018/10/20 19:49 说明:给定一个链表,两两交换其中相邻的节点,并返 ...
- LeetCode 24——两两交换链表中的节点
1. 题目 2. 解答 新建一个哨兵结点作为头结点,然后每次交换相邻两个结点.并依次将它们连接到新链表中去,再将原链表中后面的结点也串到新链表后面.直至到达链尾或者剩余一个节点,则此时返回新链表的头结 ...
- NO.24两两交换链表中的节点
NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...
随机推荐
- axios&spring前后端分离传参规范总结
前后端分离开发的场景下,开发人员的工作内容更加专注与专业,但是也产生了一些额外的沟通成本.比如:本文中为大家说明的前后端参数传递与接受方法.本文主要是面对前端使用axios,后端使用Spring进行参 ...
- 网站加了CDN后,字体图标报错Access-Control-Allow-Origin
这两天将自己做的网站(PM老猫)上线了,上线后发现因为之前购买的服务器带宽较小,第一次打开网站页面就会比较慢,想着给网站加了个CDN,让静态文件直接通过CDN访问.网上一找发现可以白嫖的CDN服务挺多 ...
- python3.7爬虫:使用Selenium带Cookie登录并且模拟进行表单上传文件
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_142 前文再续,书接上一回,之前一篇文章我们尝试用百度api智能识别在线验证码进行模拟登录:Python3.7爬虫:实时api(百 ...
- Mac os:将Homebrew的下载源换成国内镜像增加下载速度(阿里云镜像)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_135 可能所有的mac os系统爱好者都遇到过下面这种倒霉情况,在网络环境不太好的时候,你满怀期待的敲下 brew install ...
- 一文带你了解webrtc基本原理(动手实现1v1视频通话)
webrtc (Web Real-Time Communications) 是一个实时通讯技术,也是实时音视频技术的标准和框架. 大白话讲,webrtc是一个集大成的实时音视频技术集,包含了各种客户端 ...
- 先导,对IOC容器的理解
先导,对IOC容器的理解 通俗的讲就是把你的class类交给spring的IOC容器去管理 需要对该类的属性注入一些值,就可以通过spring提供的xml文件或者注解进行注入 自己使用时在IOC容器工 ...
- 5. MGR管理维护 | 深入浅出MGR
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 切换主节点 2. 切换单主/多主模式 3. 添加新节点 4. 删除节点 5. 异常退出的节点重新加回 6. 重 ...
- Docker 链接sqlserver时出现en-us is an invalid culture错误解决方案
在部署服务到docker的时候出现全球化错误 System . Global ization . Cul tureNotFoundException: Only the invariant cultu ...
- Docker 08 部署Elasticsearch
参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...
- 利用 Word 表格对文字、图文进行排版
在以前,Web 前端工程师利用 <table /> 元素对网页布局进行排版,但是如今却不推荐此元素排版了,而是改用 <div /> 元素和 CSS 弹性布局(或网格布局)对网页 ...