本帖的程序再简单不过,然而,竟是面试时候踩的坑。。。真的不应该。。。不应该眼高手低,代码要敲完运行一下,检验错误。忽略了,记个教训。
//链表逆置
struct ListNode
{
int val;
ListNode *next;
};
ListNode* Creat_List(int a[],int n)
{
ListNode* p=new ListNode();
p->val=a[0];
p->next=NULL;
ListNode* head=p;
for(int i=1;i<n;i++)
{
ListNode* tem=new ListNode();
tem->val=a[i];
tem->next=NULL;
p->next=tem;
p=tem;
}
p->next=NULL;
return head;
}
ListNode* ReverseList(ListNode* head)
{
ListNode *newhead=NULL;
ListNode *node=head;
ListNode *pre=NULL;
while(node!=NULL)
{
ListNode *nextnode=node->next;
if(nextnode==NULL)
newhead=node;//注意!!!此时不返回头结点。
node->next=pre;
pre=node;
node=nextnode;
}
return newhead;
}
ListNode* ReverseList2(ListNode* head)
{
if(head==NULL||head->next==NULL)
return head;
ListNode* newhead=ReverseList2(head->next);
head->next->next=head;
head->next=NULL;
return newhead;
}
int main()
{
int a[9]={9,8,7,6,5,4,3,2,1};
ListNode *head=Creat_List(a,9);
ListNode *newhead=ReverseList2(head);
while(newhead!=NULL)
{
cout<<newhead->val;
newhead=newhead->next;
}
cout<<endl;
return 0;
}
void Merge(int *a,int *b, int i, int m, int n)
{
int j,k;
for(j=m+1,k=i; i<=m && j <=n ; ++k){
if(a[j] < a[i]) b[k] = a[j++];
else b[k] = a[i++];
}
while(i <= m) b[k++] = a[i++];
while(j <= n) b[k++] = a[j++];
}
void Merge_sort(int *r,int *rf,int n)
{
int len=1;
int *q=r;
int *tem;
while(len<n)//可能之前是因为这里变量写错了
{
int s=len;
len=2*s;
int i=0;
while(i+len<n)
{
Merge(q,rf,i,i+s-1,i+len-1);
i=i+len;
}
if(i+s<n)
Merge(q,rf,i,i+s-1,n-1);
tem=q;q=rf;rf=tem;
}
}
int main()
{
int a[10]={1,3,5,0,7,9,2,4,6,8};
int b[10];
Merge_sort(a,b,10);
//此时得到的数组b是最后一次变换前的数组
for(int i=0;i<10;i++)
cout<<a[i];//注意,此时应该输出a!!!
cout<<endl;
return 0;
}