链表中环的入口节点(快慢指针 or map)

版权声明:本文为博主原创文章,转载请注明出处 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;
    }
};

猜你喜欢

转载自blog.csdn.net/baidu_35679960/article/details/82190781