24. 两两交换链表中的节点

题目链接:24. 两两交换链表中的节点

题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2: 输入:head = []
输出:[]

思路

两两交换节点的重要点在于判断while循环里面的条件,以及cur临时指针应该直向何处?

因此画图理解cur指针的指向以及每一步骤:



拉直后的图像:



由上图知

步骤一:用虚拟头节点连接第二个节点,准备交换

步骤二:1、2两节点进行交换

步骤三:虚拟头节点向后移两位,准备进行下一组交换

	cur->next=cur->next->next;//步骤1
cur->next->next=tmp;//步骤2
cur->next->next->next=tmp1;//步骤3
//cur->next既代表着指针域,也代表着下一个节点

代码展示

//给定一个链表,亮亮交换相邻的节点,返回交换后的链表
//不能单纯的改变节点内部的值,而是需要实际的进行节点交换
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
dummyhead = new();//设置一个虚拟头节点
dummyhead = head;//让虚拟的指向head(第0个节点)
cur = dummyhead;//让cur临时指针指向虚拟节点,才能对0,1节点进行操作 while(cur->next != null && cur->next->next != null){
/*思考遍历到什么时候终止?——画图可得:cur指针每次控制后两个指针进行交换(奇数个节点)
同理画图得:偶数时cur-》next的值为空,则结束循环 */
temp = cur->next;//在赋值操作前定义临时temp节点保存cur-》next(第0号节点)
temp1 = cur->next->next->next;//同理要保存节点(第2号节点)
cur->next = cur->next->next;//赋值操作,即虚拟指向第1号节点(头节点为0)
cur->next->next = temp;//第一号节点指向第0号
temp->next = temp1;//第0号指向第2号
//拉直后就是: 虚拟-》1-》0-》2
cur = cur->next->next;//不管交换,只要让cur移动到要交换的两个节点的前一个,即往后移了两位。
} return dummyhead->next;//返回真正的头节点
}

19.删除链表的的倒数第N个节点

题目链接:19.删除链表的的倒数第N个节点

题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 

输入:head = [1], n = 1 输出:[] :

输入:head = [1,2], n = 1 输出:[1]

思路

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。(还是画图好理解)

第一步:定义fast和slow指针,初始值都为虚拟头节点(dummyhead)

第二步:fast先走n+1步(这里很重要),因为你fast先走了n+1的话,slow最后也应该剩下n+1(从后往前数),那么slow指针实质是落在了倒数第n+1个节点中(方便做删除操作)。

第三步:fast和slow同时移动,直到fast指向末尾(即空null)。

第四步:删除slow指向的下一个节点(即倒数第n个)

代码如下

//删除倒数第n个节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n){
dummyHead = new ListNode(0);//构造虚拟
dummyHead->next = head; // 虚拟指向头节点
fast = dummyhead;
slow = dummyhead; //同时指向虚拟节点
n++;//安全起见,直接加一
while(n && fast != null){//移动快指针,走n步
fast = fast->next;
n--;
//与while(n-- && fast != null)写法一样
}
while(fast != null){
fast = fast->next;
slow = low->next;
//快慢指针一起移动直到fast为空
}
solw->next = slow->next->next;//fast为空时,删除第n个元素(slow-next)的操作
return dummyhead->next;
}
}

面试题 02.07. 链表相交

题目链接:面试题 02.07. 链表相交

题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

思路

首先要定义两条链表,让cura指针和curb指针分别指向a,b的头结点。在求出两份条链表的长度,求出长度差值,然后让curA移动到和curB末尾对齐的位置。

此时要检查cura和curb是否相同,不同的话,同时向后移动一位,直到遇到有cura==curb,则找到交点,

否则循环退出返回空指针。

代码展示

//链表相交
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
curA = headA;
curB = headB;
int lenA = 0, lenB = 0;//记录a和b链表的长度
while(lenA != null){//求链表A的长度
lenA++;
curA = curA->next;
}
while (curB != NULL) { // 求链表B的长度
lenB++;
curB = curB->next;
}
curA = headA; curB = headB;
//让curA为最长链表的头,lenA为其长度
if(lenb > lena){
swap(lena, lenb);//?????
swap(cura, curb);//?????
}
// 求长度差
int gap = lenA - lenB;
// 让curA和curB在同一起点上(末尾位置对齐)
while (gap--) {
curA = curA->next;//等同于while(gap),gap--;写外面
}
//以下:遍历cura和curb,有相同则直接返回
while(curA != null){
if(curA == curB){
return curA;
}
curA = curA->next;
curB = curB->next;
} return null;
}
}

总结

  • 链表的种类主要为:单链表,双链表,循环链表

  • 链表的存储方式:链表的节点在内存中是分散存储的,通过指针连在一起。

  • 链表是如何进行增删改查的。

  • 数组和链表在不同场景下的性能分析。

  • 链表的虚拟头节点

    虚拟头节点的设置是增删改查中十分重要的方法,通过设置虚拟头节点,链表在进行操作时可以不用区分进行头节点和非头节点的操作,使更加方便

表的基本操作

这是练习链表基础操作的非常好的一道题目,考察了:

  • 获取链表第index个节点的数值

  • 在链表的最前面插入一个节点

  • 在链表的最后面插入一个节点

  • 在链表第index个节点前面插入一个节点

  • 删除链表的第index个节点的数

  • 可以说把这道题目做了,链表基本操作就OK了,再也不用担心链表增删改查整不明白了。

代码随想录训练营day 5|24.两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题02.07.链表相交 142.环形链表Ⅱ的更多相关文章

  1. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

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

    今天链表致死量 第一题 public static class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { ...

  3. 代码的鲁棒性:链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点.例如:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从 ...

  4. leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表

    24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...

  5. [LeetCode] 24. 两两交换链表中的节点

    题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是 ...

  6. 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同

    在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...

  7. NO.24两两交换链表中的节点

    NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...

  8. LeetCode 24. 两两交换链表中的节点(Swap Nodes in Pairs)

    题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能 ...

  9. 【Leetcode链表】两两交换链表中的节点(24)

    题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 2- ...

  10. Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解

    题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4,你应该返回 ...

随机推荐

  1. python进阶之路16 模块入门

    索引取值与迭代取值的差异 l1 = [11,22,33,44,55] 1.索引取值 可以任意位置任意次数取值 不支持无序类型的数据取值 2.迭代取值 只能从前往后依次取值无法后退 支持所有类型的数据取 ...

  2. [cocos2d-x]关于3.x的触摸机制

    触摸机制的概念 通过对要监听触摸的节点进行注册,然后自定义相应的触摸函数,由事件监听器实现对触摸的监听并且实现相应的响应动作. 触摸的分类 单点触摸 下面是实现单点触摸监听的步骤: //第一步:先创建 ...

  3. vue 中引入iframe,动态设置其src,遇到的一些小问题总结

    1.重置其样式,去掉外框以及滚动条等 <iframe id="myIframe" ref="iframe_a" :src="mySrc" ...

  4. 用if语句替换三元运算符-标准的switch语句

    用if语句替换三元运算符 在某些简单的应用中,if语句是可以和三元运算符互换使用的. public static void main(String[] args) { int a = 10; int ...

  5. drf-day6——九个视图子类、视图集、路由系统、认证组件

    目录 一.九个视图子类 二.视图集 2.1 通过ModelViewSet编写5个接口 2.2 通过ReadOnlyModelViewSet编写2个只读接口 2.3 ViewSetMixin源码分析 总 ...

  6. (转载)Python中关键词yield怎么用?

    原文: https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do 译文: https://zhuanlan.z ...

  7. springcloud04 Ribbbon

    Ribbbon虽然现在已经进入维护模式了,但是使用的还是很多的. 1.官网 https://github.com/Netflix/ribbon/wiki/Getting-Started 2.Ribbo ...

  8. 运行第一个Go文件

    Go学习(1)一. 使用GoLand运行第一个Go文件 目录 Go学习(1)一. 使用GoLand运行第一个Go文件 前言 一.创建项目 二.编辑运行/调试配置 三.编写并运行代码 总结 前言 Go语 ...

  9. BSPline

  10. Networking && Internet 计网学习笔记一

    Networking && Internet 计网学习笔记一 参考书籍: James F. Kurose, Keith W. Ross. 计算机网络-自顶向下方法 (7th). 机械工 ...