/************************************************************************/
/*@author lynnbest
問題3:單連結串列的就地逆置
*/
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}listnode;
int length(listnode *head);
void InsertListNode(listnode *head,int pos,int data);
void printflist(listnode *head);
void InverseListNode(listnode *head); //單連結串列的就地逆置
void main()
{
printf(" 單連結串列的就地逆置 \n");
printf("----by lynnbest ----\n\n");
int a[]={1,2,3,4,5,6,7,8,9,10,11};
int len=sizeof(a)/sizeof(a[0]);
listnode *head=(listnode *)malloc(sizeof(listnode));//建立頭結點
if(NULL==head)
{
printf("head malloc建立失敗\n");
exit(-1);
}
head->next=NULL;
for(int i=0;i<len;i++)
InsertListNode(head,i+1,a[i]);
printf("就地逆置前為:\n");
printflist(head);
InverseListNode(head);
printf("就地逆置後為:\n");
printflist(head);
}
void InsertListNode(listnode *head,int pos,int data)
{
if(pos<1||pos>length(head)+1)
{
printf("插入位置錯誤\n");
return;
}
listnode *pre=head,*q; //pre 先驅指標 q新開闢的節點
if(NULL==(q=(listnode *)malloc(sizeof(listnode))))
{
printf("malloc分配失敗\n");
exit(-1);
}
q->data=data;
q->next=NULL;
for(int i=1;i<pos;i++)
pre=pre->next;
q->next=pre->next; //先更新新節點next
pre->next=q; //在更新pre next
}
int length(listnode *head)
{
listnode *p=head->next;
int count=0;
while(p!=NULL)
{
count++;
p=p->next;
}
return count;
}
void printflist(listnode *head)
{
//printf("當前連結串列元素為:\n");
listnode *p=head->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
printf("\n");
}
void InverseListNode(listnode *head)
{
/* listnode *pre=NULL,*p=head->next,*s;//pre指向頭結點,p指向第一個元素
while(p!=NULL)
{
s=p->next; //s為待逆置節點
head->next=p; //p為當前要逆置的點
p->next=pre; //將當前指標 指向前一個節點
pre=p; //pre 更新
p=s; //p更新
}
*/
/************************************************************************/
/*思路:
1.先把頭結點next NULL
2.然後儲存帶逆置點
3.先將逆置的點的next域指向前一個 head->next
4.在更新 head->next
5. 更新p=q;
*/
/************************************************************************/
listnode *p=head->next,*q;
head->next=NULL;
while(p)
{
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
}