链表的逆转算法是常规招聘中的考题,比较灵活,现在给出整个实现的代码,仅供各位参考~~~~~~~~~ 该算法暂时只考虑了实现功能,未进行优化,未释放指针。 该算法主要的思想是:设置三个节点分别指向原来链表的前三个节点,然后依次移动三个指针,直至到达尾节点。 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> struct Node{ int key; struct Node* next; }; Node *Reverselist(Node *head) { //头结点为空或者只有一个结点,直接返回该结点 if(NULL==head||NULL==head->next) { return head; } //定义三个Node类型指针变量,便于交换指针 Node *p1=head; //指向头结点 Node *p2=p1->next; //指向第一个结点的下一个结点 Node *p3=p2->next;//指向第二个结点的下一个结点 p1->next=NULL; //先把第一个结点的下一个结点指向NULL while(NULL!=p3) { p2->next=p1; p1=p2; p2=p3; p3=p3->next; } //当p3为null时 p2->next=p1; //第二个结点指向p1 head=p2; //头结点就是p2 return head; } int main() { Node *node,*first,*temp; first=NULL; while (1) { node=(Node* )malloc(sizeof(Node)); scanf("%d",&node->key); if (node->key<=0) break; else { if(first==NULL) { first=node; first->next=NULL; temp=first; } else { temp->next=node; temp=node; temp->next=NULL; } } } temp=Reverselist(first); while(temp!=NULL) { printf("%d ",temp->key);2 temp=temp->next; } return 0; }