我们今天继续来看链表的算法题目
我们先来看第一道题:
这是一道牛客网的题目:
链表的回文结构_牛客题霸_牛客网
我们来看这道题:首先我们要判断是不是回文结构,我们之前判断过数组的回文,这是比较好判断的,但是单链表只能单向的进行,不能反向。
这时候我们就有了一个思路:我们把他给改成反向的不就可以了;然后把他两边往中间靠拢:这样来进行比较:但是我们该怎样的把他给改成反向的呢?在哪里反向
思路一:我们可以使用快慢指针来找到我们的中间节点,然后我们让中间节点以后的结点的指针都变成反向的,我们可以设置三个指针来完成,完成以后我们就可以在他的两边开始进行遍历来比较
我们来看代码
这个就是我们实现完的代码。
其实我们还有一种思路,就是因为我们之前都是在数组里面判断回文结构的,数组来进行判断也是比较简单,所以这里我们就可以产生另一种思路,那就是我们可以创建一个数组,用来存储我们的链表里面的数据,储存完后,我们使用数组来进行判断,这样的话也可以;
我们来看第三道题:
160. 相交链表 - 力扣(LeetCode)
我们来看第三道题,这是一道力扣上面的题目:题目的要求是让你找链表的交点,但是我们在进行的时候,他的两个相交的链表长度可能是不一样的,那么我们就要先让他们位于同一起跑线上来进行:我们可以计算出长的链表比短的链表的长度有多长,然后让长链表先走,让他们在同一起跑线上,然后进行比较;
这道题比较简单
我们来看第四道题:
141. 环形链表 - 力扣(LeetCode)
我们的这个题目的要求是看你的这个链表有没有环,有的话返回true,没有的话返回false
这个题目我们的思路是快慢指针,我们使用快满指针来进行判断,当我们的两个指针进入到环里面以后,一个走得快,一个走的慢,但是他们一定是会相遇的;不管你的循环链表里面是奇数个还是偶数个,或者是说这两个指针相差的距离是奇数还是偶数,都是可以的,只是奇数的时候会套圈,但是还是可以遇上,全是偶数的时候,第一圈就可以遇见了。
我们来看我们的代码
在这个代码里面要注意,我们进入到while循环里面去以后,我们是要先进来就要改变fast和slow指针,不能进来就进行比较,进来的时候他们都是head;这时候不能进行比较;
我们来看第五道题:
142. 环形链表 II - 力扣(LeetCode)
这一题我们的要求是你首先要判断是不是环形链表,如果是的话就把他的成环的开始的结点返回,如果没有成环的话就返回NULL;
这一题会有一个新的东西:
我们先看第一个要求,判断环形链表的话,我们还是快慢指针来解决,没有什么问题,然后就是返回他的结点,这个的话我们就要看一个新的东西了:
我们的快慢指针结合的位置到我们的第一个开始循环的位置,和我们的第一个有效的结点到我们的开始循环的结点的距离是一样的;
我们就可以通过这个来实现我们的代码: