您的位置:首页 > 其它

算法——链表问题集锦

2015-06-24 22:58 363 查看
直接上代码

typedef struct MyNode{
int data;
MyNode * pNext;
MyNode(int d=0,MyNode * pNe=NULL):data(d),pNext(pNe){};
}node;
void OutputNode(node *pRoot)
{  if(pRoot==NULL) return ;
cout<<pRoot->data<<" ";
OutputNode(pRoot->pNext);}
node * CreateTestList()//创建测试数据链表1-2-3-4-5---10
{   /*函数中用new申请空间,函数结束时,自动销毁的是局部变量root/p1/p2,而申请的空间没被释放,
出现了内存泄漏,只有整个程序都退出时,系统收回进程空间,它才被释放 掉了*/
node *root; node *p1, *p2;
root=p1=new node(1);
for(int i=2;i<=10;i++)
{ p2=new node(i);
p1->pNext=p2;
p1=p2;    }
//  p1->pNext=root;//有环数据
return root;
}
node * Reverse(node *pRoot)//单向链表逆转
{   if(pRoot==NULL)  return  pRoot;//
node * pPre=NULL, * pCur=pRoot,* pNe=pRoot->pNext;
do{pNe=pCur->pNext;
pCur->pNext=pPre;
pPre=pCur;    pCur=pNe;
}while(pCur!=NULL );
return pPre;
}
int Len(node * pRoot)//计算链表的长度
{     if(pRoot==NULL) return 0;
int len=0; node * pCur=pRoot;
do{len++; pCur=pCur->pNext;
}while(pCur!=NULL );
return len;
}
//找出单向链表中中间结点
node * GetMidNode(node * pRoot)
{    node * step1=pRoot, * step2=pRoot;
while(NULL!=step2){
step2=step2->pNext;
if(NULL==step2) return step1;
step2=step2->pNext;
if(NULL==step2) return step1;
step1=step1->pNext;
}
return NULL;
}
//从无头单链表中删除节点
void DeleteCurNode(node * & pCur)
{    assert(pCur!=NULL); //最后一个节点情况无法解决
node * pNext=pCur->pNext;
if(pNext!=NULL)
{ pCur->data=pNext->data;
pCur->pNext=pNext->pNext;
delete pNext;
}
//这里如果pNext==NULL直接delete pCur的话,单向链表就没有尾了。
}
//已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序
node * Merge(node * head1,node * head2)
{ if(head1==NULL) return head2;//p2节点插入到p1节点链表中
if(head2==NULL) return head1;
node * head,* p1,*p2;   head=p1=p2=NULL;
if(head1->data<=head2->data)
{head=head1; p1=head1->pNext; p2=head2; }
else{   head=head2;p1=head1; p2=head2->pNext;}
node *pCur=head;//刚加入合并后链表的结点
while(p1!=NULL && p2!=NULL){
if(p1->data<=p2->data)
{pCur->pNext=p1;   pCur=p1;   p1=p1->pNext;}
else {    pCur->pNext=p2;  pCur=p2; p2=p2->pNext;}
}
if(p1!=NULL) pCur->pNext=p1;
if(p2!=NULL) pCur->pNext=p2;
return head;
}
node * Merge2(node *head1,node *head2)//递归合并两个有序链表
{    if(head1==NULL) return head2;
if(NULL==head2) return head1;
node * head;
if(head1->data<=head2->data)
{     head=head1;
head->pNext=Merge2(head1->pNext,head2);
} else
{ head=head2;
head->pNext=Merge2(head1,head2->pNext);
}
return head;
}


如何判断一个单向链表是否有环的问题:

1、如何判断是否存在环?

2、如何知道环的长度?

3、如何找出环的连接点在哪里?

4、带环链表的长度是多少?

观点参考地址:

http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: