单链表逆置,超级热门的面试题,感觉最近见的比较多啊
一种方法是非递归,一种方法是递归
非递归方法:
#include <iostream> #include<cstdio> #include<cstdlib> using namespace std; /*链表结构体*/ struct Node{ int data; struct Node* next; }; static void reverse(struct Node** head_ref){ //函数形参采用双指针,即指针的指针,至于为什么要用双指针,可以看主函数的调用情况
/*建立三个结构体指针*/ struct Node* prev =NULL; struct Node* current =*head_ref; struct Node* next; while(current!=NULL){ next =current->next; current->next=prev; prev=current; current=next; } *head_ref=prev; }
/*头插法增加节点*/ void push(struct Node** head_ref,int new_data){ struct Node* new_node= (struct Node*)malloc(sizeof(struct Node)); new_node->data=new_data; new_node->next=(*head_ref); (*head_ref)=new_node; }
/*打印节点*/ void printList(struct Node *head){ struct Node *temp=head; while(temp!=NULL){ cout<<temp->data<<" "; temp=temp->next; } }
int main() { struct Node *head=NULL; push(&head,2); push(&head,4); push(&head,6); push(&head,8); printList(head); reverse(&head); cout<<endl; printList(head); return 0; }