输入一个单链表的头节点,翻转该链表,然后输出翻转后的链表的头节点。
定义链表节点:
typedf struct Node{
int data;
Node *next;
}Node,*List;
非递归翻转:
用Cur指针表示当前要进行翻转的节点,用Pre,Next指针分别表示Cur的前继,后继。用tail表示最后的节点。
Node* reverse(List *head){
Node *Cur=head;
Node *Pre=NULL,*Next=NULL,*tail=NULL;
while(Cur!=NULL){
Next=Cur->next;//更新Next
if(Next==NULL){
tail=Cur;
}
Cur->next=Pre;//反向,cur指向前面的节点
Pre=Cur;//更新pre,下一个要更新的节点的前继就是当前节点
Cur=Next;//更新cur,新的cur就是当前cur的后继节点
}
return tail;
}
递归的方式:
从链表尾往头部翻转
Node* reverse2(List *head){
if(head==NULL ||head->next=NULL){
return head;
}
Node* new=reverse2(head->next);
head->next->next=head;
head->next=NULL;
return new;
}