1、判断单链表是否有环:
题目描述:判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?
图解分析:
对于有环无环,我们只需要快慢指针,在快指针fast != NULL && fast->next != NULL
成立时,若是能达到快指针与慢指针的再次重逢,则其有环。
对于环的长度、非环段长度、环与非环交点的数据/地址等问题,其主要矛盾在于要发现分析中的关系式,把握住了这个关系式,就能很好解决有环问题的一系列操作,否则处理方式可能就会比较复杂。很早以前,我采用了一个很古老的方式:用指针p来遍历链表,每次遍历一个节点,将p节点的地址存放在一个数组中,在p不等于NULL成立时,每次遍历链表的指针p后移一次,更新并遍历一次数组,若数组中出现重复的地址,表明有环(现在看来复杂度稍大,但这是一个稳扎稳打的方法)。
2、该题目的变形:
题目描述:判断两个单链表是否相交,若两个单链表相交,计算相交点。
这个问题解决方法其实不唯一,而我们根据刚刚解决的单链表是否有环问题,就可以很好解决该问题了。
图解分析:
3、删除单链表中给定地址的节点:
问题描述:
给出单链表头指针以及要删除节点的地址,要求写代码删除这上个结点(每个结点数据有限,并且时间复杂度为 O(1),如何实现。
注意本题目中有一个限定:节点数据有限(突破处)。因为我们一般删除指定节点就是释放该节点的内存,而这一点限定就是要打破常规思维。
图解分析: