目录
1.返回倒数第K个节点
2.回文结构的判断
3.相交链表的判断,返回交点
1.返回倒数第K个节点
(1)返回链表的第k个节点,我们这里的做法是定义两个指针,这两个指针之间相差的是k这个长度;这个过程的实现就是让这两个指针都指向头部节点,让我们的快指针移动k个单位长度,慢指针原地不动,这个过程我们是使用的k--进行循环的控制;
(2)第二个while循环是进行的指针的移动,这个时候我们的快慢指针都已经在指定的位置,接下来进行的是两个指针的同时移动,最后循环结束的时候慢指针的下一个节点恰好就是我们要找到的倒数第k个节点;
因为我们的第二个循环的循环条件是fast当我们的fast指向6的后面的时候(看最下面的图片),slow才指向4,但是这个时候已经不满足循环的进行条件,已经跳出循环了,这个时候我们就可以发现,slow->next正好就是我们要找的倒数第k个节点;
(3)下面的一连串图片或许可以帮祝您进行进一步的理解:下面的过程是用k=2作为例子的
2.回文结构的判断
(1)这个回文结构的判断就比较有水平了,这道题目要求我们要对链表的中间节点的查找方法以及链表的逆置这些基本的操作十分了解,才可能解决这道综合性的题目;
(2)这里我们首先要找到中间的节点,奇数个节点的中间节点是唯一的,偶是个的话有两个,我们返回的是右边的那个;
(3)我们分情况进行讨论(讨论的过程都是用的上面的这两个例子),如果是奇数个节点,那么就可以直接找到对应的中间位置的节点3,我们接下来进行的操作就是从3这个位置开始后面的节点都进行逆置
逆置完成之后我们就要进行比较,从中间节点的位置开始,1和1比,2和2比都相等,那么问题来了?3和谁进行比较呢?其实不要忘了,我们后面虽然逆置了,但是这个是链表,链表里面的,我们的第二个位置的2next指针指向的是原来的3,虽然逆置完之后,3的位置已经变了,但是我们的第二个位置的2next指针还是指向3的,我们的让2->next指向的数值和3进行比较,发现是相等的,这个时候就可以说明我们的这个奇数个节点的链表是会回文结构的;
(4)如果是下面的偶数个节点,我们就从第二个3位置开始让后面的都逆置,逆置完之后,让对应位置的节点进行比较,对应位置的节点相等,说明就是回文结构的。
(5)bool45行开始的就是我们的主函数,在这个函数的第一行,我们调用封装的函数找到中间的节点,第二行我们对从中间节点向后的节点进行逆置;
接下来就是使用循环进行比较,如果发现有位置对应的节点不一样说明就不是回文结构,返回false,如果循环的整个过程对应的位置都一样,就说明是回文结构,返回true.
3.相交链表的判断,返回交点
(1)两个链表的相交,肯定是中间的某个节点相交,最后的一个节点肯定是一样的,下面展示的就是我们的思路:
(2)首先,我们要明确的是两个链表的长度可能是不一样的,我们要让他们指向对应的位置,什么叫做对应的位置?
例如上面的图片,链表A长度是5,链表B长度是6,如果他们定义了两个指针各自指向链表的头结点然后开始移动,他们两个一定不会在节点的位置相遇,因为这两个链表的长度是不一样的;
我们要实现的就是上面显示的,让链表A里面指针指向a1,B链表里面的指针指向b2,为什么是b2呢,因为b2和较短的链表的头结点到交点位置的长度是一样的,这样再同时移动就可以让这两个链表在节点的位置相交;
(3)我们这里首先要解决的首要的问题就是,如何在较长的链表里面找到这个和较短链表头结点位置对应的节点;
我们这里采用的方法是分别计算两个链表的长度,第一个链表(示例里面)长度是6,第二个链表的长度是7,我们让7-6=1,得到的1就是长链表里面的对应的位置的下标,下标为1位置的节点就是长链表里面的和短链表的头结点位置对应的节点;
(4)细心一下就会发现,我们的初始化的时候len设置的是1,为什么是1呢?因为在循环条件里面,我们的设置的循环条件是curA->next,当这个链表来到最后的一个节点,next节点就是空的,已经进不去循环了,所以相当于我们的最后一次的len并没有加上,如果我们想要得到这个链表的长度的精确值,我们就初始化为1,其实初始化为0得到的是链表的长度减去一,这个对于我们的代码是没有影响的,因为我们要计算的是两者之间的差值,就算两个链表的长度都少计算一个,最后得到两个链表的长度的差值其实是不会改变的;
(5)这个工作完成之后,我们的curA,curB这个时候就指向的是链表的尾部,如果到尾部他们两个都不相同,说明这两个链表是没有公共的节点的;我们就可以直接返回NULL了;
(6)这个时候我们已经知道了移动几个位置长链表可以找到对应的位置,我们使用假设的方法得到长度的差值,以这个gap--作为循环的条件,让longlist右移,循环结束longlist就到了和shortlist指定位置;
(7)接下来我们就可以从短链表的头部开始移动,长链表的指定位置(这个指定位置就是我们的gap--循环结束之后指向的位置)开始移动,找到对应的相交的节点,最后返回随便的一个,因为这个时候退出循环说明两个链表已经相交,这个时候长链表和短链表指向的都是我们要找的交点。