链表的建立 删除 插入
#include<iostream>
using namespace std;
template<typename T>
class link
{
public:
link(T d,link* L)
{
Data=d;
next=L;
}
link* NEXT()const
{
return next;
}
T ReadData()const
{
return Data;
}
//link* createLink();
//void insertNode(link* head,T x,int loc);
//void deleteNode(link* head,T x);
T Data;
link * next;
};
template<typename T>
void createLink(link<T>** head)
{
T x;
link<T>* L;
L=( link<T>*)malloc(sizeof(link<T>));
if(L==NULL) return;//再三强调,一定要这步
L->next=NULL;
cout<<"请输入数据:"<<endl;
cin>>x;
L->Data=x;
bool bResult=true;
link<T>* p=NULL;
while(bResult)
{
cin>>x;
if(x!=EOF)
{
p=( link<T>*)malloc(sizeof(link<T>));
p->next=NULL;
}
else
break;
if(p==NULL) break;
p->Data=x;
p->next=L->next;
L->next=p;
}
*head=L;
return ;
}
template<typename T>
void insertNode(link<T>* head,T x,int loc)
{
if(head==NULL)
return;
link<T>* p=(link<T>*)malloc(sizeof(link<T>));
link<T>* pre=head;
if(p==NULL) return;
p->Data=x;
for(int i=0;i<loc;++i)
pre=pre->next;
p->next=pre->next;//插入的关键代码
pre->next=p;
return;
}
template<typename T >
void deleteNode(link<T>** head,T x)
{
link<T>* p=*head;
link<T>* pre=NULL;
if(x==p->Data)//处理头结点
{
*head=p->next;
free(p);
return;
}
while(x!=p->Data)
{
pre=p;
p=p->next;
}
pre->next=p->next;
free(p);//释放节点
}
template<typename T>
void printfLink(link<T>* head)
{
if(head==NULL)
{
cout<<"空链表";
return;
}
link<T>* p;
p=head;
cout<<"打印元素:"<<endl;
while(p)
{
cout<<p->Data<<endl;
p=p->next;
}
}
int main()
{
link<int>* head=NULL;
createLink( &head);
printfLink( head);
insertNode( head,100,1);
printfLink( head);
deleteNode( &head,1);
printfLink( head);
return 0;
}
链表环的检测和环起点的查询
bool hasCircle(link<T>* head)
{
if(head==NULL)return false;
bool hasCircle=false;
link<T>* slow=head;
link<T>*fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
hasCircle=true;
break;
}
}
return hasCircle;
}
template<typename T>
link<T> beginOfCircle(link<T>* head)
{
if(head==NULL)return;
link<T>* slow = head;
link<T>* fast = head;
while (fast && fast->link)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
break;
}
if (fast == NULL || fast->next == NULL) //此时链表无环;
return NULL;
fast = head;
while (slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return fast;
}
链表交叉
方法一:
其中一个链表的首尾相连,转化为求链表是否有环,并求起点。
其他方法见<<编程之美>>。