算法——链表问题集锦

直接上代码

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

你可能感兴趣的:(算法)