您的位置:首页 > 职场人生

剑指offer面试题15——扩展2:判断一个单向链表是否形成环结构

2015-08-05 14:43 666 查看
题目:

判断一个单向链表是否形成了环状结构。和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另外一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环状结构;如果走得快的指针走到了链表的末尾(m_pNext指向NULL)都没有追上走得慢的指针,那么链表就不是环状结构。

本题我的想法是:采用哈希查找来做,从前往后遍历一遍。

#include<iostream>
#include<vector>
#include<set>
using namespace std;

//链表的数据结构
struct ListNode
{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};

//创建一个单链表
ListNode* product(vector<int>& vec,int n)
{
if(n==0)
return NULL;
ListNode* ptr1=new ListNode(vec[0]);
int i=1;
ListNode* ptr2=ptr1;
while(i<n)
{
ptr2->next=new ListNode(vec[i]);
ptr2=ptr2->next;
i++;
}
return ptr1;
}

//单链表每个结点的输出
void cout_node(ListNode* root)
{
if(root==NULL)
return;
ListNode* ptr1=root;
while(ptr1!=NULL)
{
cout<<ptr1->val<<' ';
ptr1=ptr1->next;
}
cout<<endl;
return;
}

bool ifcircle(ListNode* root)
{
if(root==NULL)
return false;
if(root->next==NULL)
return false;
set<ListNode*> se;
ListNode* ptr=root->next;
se.insert(root);
while(ptr)
{
if(se.count(ptr)==1)
return true;
se.insert(ptr);
ptr=ptr->next;
}
return false;
}

int main()
{
int ary[10]={1,2,3,4,5,6,7,8,9,10};
vector<int> vec(ary,ary+5);
ListNode* root=product(vec,5);
cout_node(root);
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: