(1)鏈表的反轉
原先的鏈表保留一個頭結點head,通過該頭結點可以遍歷鏈表的每一個結點裡內容,如果在鏈表遍歷的過程中,再用兩個指針把把鏈表裡的內容指針的指向改變,使原先指向下一個節點的,改為指向它的前一個節點,就可以實現鏈表的反轉了!
#include<stdio.h>
#include<stdlib.h>
struct llist
{
int num;
struct llist *next;
};
typedef struct llist node ;
typedef node *llink;
void printllist(llink ptr)
{
while(ptr!=NULL)
{
printf("[%d]",ptr->num);
ptr=ptr->next;
}
printf("\n");
}
llink createllist(int *array,int len)
{
llink head;
llink ptr,ptr1;
int i;
head=(llink)malloc(sizeof(node));
if(!head)
return NULL;
head->num=array[0];
head->next=NULL;
ptr=head;
for(i=1;i<len;i++)
{
ptr1=(llink)malloc(sizeof(node));
if(!ptr1)
return NULL;
ptr1->num=array[i];
ptr->next=NULL;
ptr->next=ptr1;
ptr=ptr->next;
}
return head;
}
//鏈表反轉的實現過程
llink invertllist(llink head)
{
llink mid,last;
mid=NULL;
while(head!=NULL)
{
last=mid;
mid=head;
head=head->next;
mid->next=last;
}
return mid;
}
void freellist(llink head)
{
llink ptr;
while(head!=NULL)
{
ptr=head;
head=head->next;
free(ptr);
}
}
int main()
{
int llist[6]={1,2,3,4,5,6};
llink head;
head=createllist(llist ,6);
if(!head)
{
exit(1);
}
printllist(head);
head=invertllist(head);
printllist(head);
printllist(head);
return 0;
}
分享到: