这部分主要介绍链表 包括基本的链表建立 删除 插入,以及常用的链表环的检测,环起点,链表交叉,交叉点

链表的建立 删除 插入

      

#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;

}



链表交叉

方法一:

其中一个链表的首尾相连,转化为求链表是否有环,并求起点。

其他方法见<<编程之美>>。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值