链表热门面试题(二)

目录

    • 前言
    • 一、删除链表的倒数第 N 个结点
    • 二、两两交换链表中的节点
    • 三、旋转链表
    • 四、删除排序链表中的重复元素
    • 五、删除排序链表中的重复元素 II
    • 六、反转链表II
    • 七、删除链表中的节点
    • 八、奇偶链表

前言

链表热门面试题(二)_第1张图片

一、删除链表的倒数第 N 个结点

题目:
链表热门面试题(二)_第2张图片
方法1:找到删除的结点(双指针法)+尾插
提交代码:
链表热门面试题(二)_第3张图片

提交结果:
链表热门面试题(二)_第4张图片

思路分析:
本题的基本思路就是先找到倒数第n个结点,然后再遍历原来链表,将不是该节点的其他结点依次尾插进新链表,然后返回新链表的头指针即可。上面这个代码我们将空表和链表中只有一个结点的情况单独进行分析,其实当链表中只有一个结点的时候,上面代码中的常规情况也是可以符合的。上面在遍历比较原来链表中的结点和删除结点的时候需要注意比较的一定只能是结点的指针,而不能是结点中存在的值,因为不同的结点可能存放的值是一样的。

方法2:找到删除的结点(双指针法)+双指针(前后指针)
提交代码:
链表热门面试题(二)_第5张图片

提交结果:
链表热门面试题(二)_第6张图片

思路分析:
这个方法是再找到要删除的结点之后,再找到删除结点的前一个结点,然后让前一个结点的next指向删除结点的下一个即可。注意找前一个的时候,prev刚开始是从NULL开始的,因为头结点没有所谓的前一个结点。

二、两两交换链表中的节点

题目:
链表热门面试题(二)_第7张图片

提交代码:
链表热门面试题(二)_第8张图片

提交结果:
链表热门面试题(二)_第9张图片

思路分析:

三、旋转链表

题目:
链表热门面试题(二)_第10张图片

提交代码:
链表热门面试题(二)_第11张图片

提交结果:
链表热门面试题(二)_第12张图片

思路分析:

四、删除排序链表中的重复元素

题目:
链表热门面试题(二)_第13张图片

提交代码:
链表热门面试题(二)_第14张图片

提交结果:
链表热门面试题(二)_第15张图片

思路分析:

五、删除排序链表中的重复元素 II

题目:
链表热门面试题(二)_第16张图片

提交代码:
链表热门面试题(二)_第17张图片

提交结果:
链表热门面试题(二)_第18张图片

思路分析:

六、反转链表II

题目:
链表热门面试题(二)_第19张图片

提交代码:
链表热门面试题(二)_第20张图片

提交结果:
链表热门面试题(二)_第21张图片

思路分析:

七、删除链表中的节点

题目:
链表热门面试题(二)_第22张图片

提交代码:
链表热门面试题(二)_第23张图片

提交结果:
链表热门面试题(二)_第24张图片

思路分析:
这个题没有给我们链表,只是给了我们要删除的结点的指针(地址),那么我们就需要自己假设这个结点是某一个链表在中的结点,那么一般情况下,删除单链表中的结点采取的方法是找到这个删除结点的上一个结点和下一个结点,那么在这个题中,没有给我们链表你,所以这种方法显然是不合适的,那么删除链表中结点的另一个思路是可以转换成删除这个链表的下一个结点,因为题目已经提示,删除的结点不是链表中的最后一个结点,说明删除的结点的下一个还是有结点的,所以我们可以转换成删除这个结点的下一个结点,步骤是先将下一个结点的数据复制到该结点,然后让当前结点的next指针指向下一个结点的下一个结点,从而下一个结点就从原来链表解除了。

八、奇偶链表

题目:
链表热门面试题(二)_第25张图片

方法1:多指针法+链表分割+链表连接
提交代码:
链表热门面试题(二)_第26张图片

提交结果:
链表热门面试题(二)_第27张图片

思路分析:

方法2:标志位法+链表分割+链表连接
提交代码:
链表热门面试题(二)_第28张图片

提交结果:
链表热门面试题(二)_第29张图片

思路分析:

你可能感兴趣的:(链表,数据结构)