单链表的反转可以使用循环,也可以使用递归的方式
1.循环反转单链表
循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可。
代码:
# include <iostream> # include <cstdlib> using namespace std; struct linkNode { int val; linkNode *next; linkNode(int x):val(x),next(NULL){} }; linkNode *reverse2(linkNode *head) { if(head==NULL) return NULL; linkNode *pre=NULL; linkNode *p=head; linkNode *h=NULL; while(p) { h=p; linkNode *tmp=p->next; p->next=pre; pre=p; p=tmp; } return h; //返回头结点 } int main() //测试代码 { linkNode *head=new linkNode(1); linkNode *p1=new linkNode(2); linkNode *p2=new linkNode(3); head->next=p1; p1->next=p2; //建立链表 1->2->3->NULL linkNode *p=reverse2(head); while(p) { cout<<p->val<<endl; p=p->next; } //输出为 3->2->1->NULL system("pause"); return 0; }2.递归实现单链表反转
# include <iostream> # include <cstdlib> using namespace std; struct linkNode { int val; linkNode *next; linkNode(int x):val(x),next(NULL){} }; linkNode *reverse(linkNode *head,linkNode * &newhead) //head为原链表的头结点,newhead为新链表的头结点 { if(head==NULL) return NULL; if(head->next==NULL) { newhead=head; } else { reverse(head->next,newhead); head->next->next=head; head->next=NULL; } return newhead; } int main() //测试代码 { linkNode *head=new linkNode(1); linkNode *p1=new linkNode(2); linkNode *p2=new linkNode(3); head->next=p1; p1->next=p2; //建立链表1->2->3->NULL; linkNode *newhead=NULL; linkNode *p=reverse(head,newhead); while(p) { cout<<p->val<<endl; p=p->next; } //输出链表 3->2->1->NULL; system("pause"); return 0; }