判断链表是否有环?
①设置两个指针,开始都指向链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,如果快的遇到NULL了,证明该链表中没有环,如果有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇
bool IsLoop(node *head)
{
node *pSlow=head;
node *pFast=head;
while(pSlow!=NULL && pFast!=NULL)
{
pSlow=pSlow->next;
pFast=pFast->next->next;
if(pSlow==pFast)
return true;
}
return false;
}
②使用map来记录链表中的结点是否被访问,若存在被访问两次的结点则说明存在环。
#include
"iostream"
#include
"map"
using
namespace
std;
map<node*,
int
>m;
bool
IsLoop(node
*head)
{
if
(!head)
return
false
;
node
*p=head;
while
(p)
{
if
(m[p]==0)
//
默认值都是0
m[p]=1;
else
if
(m[p]==1)
return
true
;
p=p->next;
}
}
1, void ReverseList(LinkList L)
{
Node *p,*q;
p = L->next;
L->next = NULL;
while(p != NULL){
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
2.
{
Node *p,*q;
p = L->next;
L->next = NULL;
while(p != NULL){
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
2.
void ReverseList(Node *head)
{
if( (NULL==head)||(NULL==head->next) )return ; //边界检测
Node* pPre=ListHead; //先前指针
Node* pCur=pPre->next; //当前指针
Node* pNext=NULL; //后继指针
while(pCur!=NULL)
{
pNext=pCur->next;
pCur->next=pPre;
pPre=pCur;
pCur=pNext;
}
ListHead->next=NULL;
ListHead=pPre; //记录下新的头结点
}
{
if( (NULL==head)||(NULL==head->next) )return ; //边界检测
Node* pPre=ListHead; //先前指针
Node* pCur=pPre->next; //当前指针
Node* pNext=NULL; //后继指针
while(pCur!=NULL)
{
pNext=pCur->next;
pCur->next=pPre;
pPre=pCur;
pCur=pNext;
}
ListHead->next=NULL;
ListHead=pPre; //记录下新的头结点
}
3.
你认为效率最高的方法,实现从1加到100.
答案 1-100的累加相当于加50次101,这样循环次数从100次降为50次:
int sun = 0
for(int i = 1,j = 100 ; i <= 50 ; i++,j--){
sun = sun + i + j;
}
答案 1-100的累加相当于加50次101,这样循环次数从100次降为50次:
int sun = 0
for(int i = 1,j = 100 ; i <= 50 ; i++,j--){
sun = sun + i + j;
}