版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/baidu_35679960/article/details/82190781
【题目】
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
【解析】
当然这个可以使用快慢指针来做,不过,快慢指针这个方法真的是涉及到数学的问题,而我,最烦数学!
我想到一个通过map来做的方法,先建立一个map< ListNode*, int> hash_map(hash_map的key为节点指针,value为对应的计数值)。
对链表进行遍历操作,在遍历的过程中对每个节点进行下标 “[]” 操作(如果某个节点还未在hash_map中,则下标运算符会创建一个新元素,其key为这个节点指针,其value为零),然后将value进行自增操作,经过下标操作和自增操作之后,这个节点在hash_map中对应的value就变成了1,而那些没有被下标操作过的节点在首次进行下标操作时对应的value是0。
如果说我们在遍历节点的过程中 ,发现某个节点对应的value是1,说明之前已经遍历过,那这个节点肯定就是链表中环的入口节点。
【参考程序】
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
map<ListNode*, int> hash_map;
while(pHead != NULL){
if(hash_map[pHead]++ != 0)//如果hash_map[head]对应的值不为零,说明之前来过一次,那么这个就是入口结点
return pHead;
pHead = pHead->next;
}
return NULL;
}
};