欲要反转一个链表,如图所示:
迭代很容易理解:我们要做的就是遍历整个链表,每当遇到一个结点,就让他指向前一个结点,而不是后一个结点。
思路:
1.为了不改变头结点,定义一个struct node型的指针current指向遍历到的结点,一个prev指向遍历到的结点的前一个结点,一个next指向遍历到的结点的下一个结点。
2.使遍历到的结点指向前一个结点。
reserve函数:
struct node* reverse(sn *head)
{
struct node* current,*prev,*next;
current=head;
prev=NULL;
while(current!=NULL)
{
next=current->next;
current->next=prev;
prev=current;//重新设定prev
current=next;//重新设定current
}
head=prev;//prev储存最后一个结点的地址,给head即可。
return head;//返回反转后的头结点的地址。
}
然后我们借助insert函数和print函数使他得以运行:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}sn;
sn* insert(sn* head,int x)
{
sn *temp=(sn*)malloc(sizeof(sn));
temp->data=x;
temp->next=head;
head=temp;
return head;
}
void print(sn*head)
{
sn* temp=(sn*)malloc(sizeof(sn));
temp=head;
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
sn* reverse(sn *head)
{
sn* current,*prev,*next;
current=head;
prev=NULL;
while(current!=NULL)
{
next=current->next;
current->next=prev;
prev=current;
current=next;
}
head=prev;
return head;
}
int main()
{
sn* head=NULL;
head=insert(head,2);
head=insert(head,4);
head=insert(head,6);
head=insert(head,8);
print(head);
head=reverse(head);
print(head);
}
结果:
反转完成咯。
下面再说一下递归的思路:
遍历链表,到达最后一个结点时,修改head使指向最后一个结点。
reserve函数:
sn* reverse(sn *p)
{
if(p->next==NULL)
{
head=p;
return 0;
}
reverse(p->next);
sn* q=p->next;
q->next=p;
p->next=NULL;
}
然后我们借助insert函数和print函数使他得以运行:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}sn;
sn* head;
sn* insert(int x)
{
sn *temp=(sn*)malloc(sizeof(sn));
temp->data=x;
temp->next=head;
head=temp;
return head;
}
void print()
{
sn* temp=(sn*)malloc(sizeof(sn));
temp=head;
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
sn* reverse(sn *p)
{
if(p->next==NULL)
{
head=p;
return 0;
}
reverse(p->next);
sn* q=p->next;
q->next=p;
p->next=NULL;
}
int main()
{
head=NULL;
head=insert(2);
head=insert(4);
head=insert(6);
head=insert(8);
print();
reverse(head);
print();
}
结果一样喔~