1、链表的反转
注意:1、输入的链表头指针为NULL或者整个链表只有一个结点时
2、反转后链表会不会断裂
3、返回的反转之后的头节点是否为原始链表的尾节点
Code:
Node *Reverse(Pnode node)
{
Node* ReverHead=NULL;
Node* pnode=node;//当前节点
Node* prev=NULL;
while(pnode!=NULL)
{
Node *pnext=pnode->next;
if(pnext==NULL)
{
ReverHead=pnode;
}
pnode->next=prev;
prev=pnode;
pnode=pnext;
}
return ReverHead;
}
2、链表中环的入口结点
环中有4个节点,让指针p1先走4步,然后指针p2和p1一起走,当p1走到入口节点,p2也与p1会相遇。
就相当于,我要走99步,只要你迈出一步,我补足那1步,我们就会相遇。
那么如何求环中结点的数目,利用快慢指针,只要他们相遇一定是在环中,只需要,从相遇的节点遍历,再次回到这个节点,我们便可知道节点的数量。
Code:求环中结点的数量
Node* Count(Pnode node)
{
if(node==NULL) return NULL;
Node *slow=node->next;
if(slow==NULL) return NULL;
Node *fast=slow->next;
while(fast!=NULL &&slow!=NULL)
{
if(fast==slow) return fast;
slow=slow->next;
fast=fast->next;
if(fast!=NULL)
fast=fast->next;
}
return NULL;
}
Code:求入口节点
Node* findnode(Pnode node)
{
if(node==NULL) return NULL;
Node* p=Count(node);
int count=1;
for(p;p->next!=p;p=p->next)
{
count++;
}
Node *fast=node ;
if(fast==NULL) return NULL;
for(int i=0;i<count;++i)
{
fast=fast->next;
}
Node *slow=node;
while(fast!=slow)
{
slow=slow->next;
fast=fast->next;
}
return fast;
}
3、删除链表中重复的节点
code:
void deleteP(Node** node)
{
if(node==NULL || *node==NULL) return ;
Node *pnode=*node;
Node *prev=NULL;
while(pnode!=NULL)
{
bool delneed=false;//用bool类型判断需不需要被删除
Node *pnext=pnode->next;
if(pnode!=NULL&&pnode->key==pnext->key)
{
delneed==true;
}
if(!delneed) //如果不需要,一直往下跑
{
prev=pnode;
pnode=pnode->next;
}
else //如果需要,那么判断有没有重复的数字
{
int value=pnode->key;
Node *del=pnode;
while(del!=NULL && del->key==value)
{
pnext=del->next;
delete del;
del=NULL;
del=pnext;
}
if(prev==NULL)
{
*node=pnext;
}
else
{
prev->next=pnext;
}
pnode=pnext;
}
}
}