http://blog.csdn.net/kuzuozhou/article/details/7451289
另外,参考:
http://blog.csdn.net/ssjhust123/article/details/7754103
#include<stdio.h> #include <stdlib.h> typedef struct node//节点存放一个数据和指向下一个节点的指针 { int data; struct node* pnext; } Node; Node *link_create()//链表创建 { int item; Node *head = NULL; do { Node *p; scanf("%d",&item); p = (Node *)malloc(sizeof(Node)); if(p == NULL) { printf("memory applied Failed\n"); break; } p->data = item; p->pnext = head; head = p; }while(getchar() != '\n'); return head; } void link_show(Node *head) { Node* p; p=head; while(p != NULL) { printf("%d ",p->data); p = p->pnext; } printf("\n"); } void link_destroy(Node *head) { Node* p; Node* tmp; p=head; while(p != NULL) { tmp = p->pnext; free(p); p = tmp; } } //Node *link_reverse(Node *head) //{ // Node *pre,*cur,*next; // /*head->pnext =NULL;*/ // // pre = head; // cur = pre->pnext; // next = cur->pnext; // head->pnext =NULL;//第一次的pre,cur,next // // if(next == NULL)//链表只有两个节点,如果没有此语句,当链表确实只有两个节点时,就会发生错误。 // { // cur->pnext = pre; // head = cur; // return head; // } // // while(next->pnext != NULL) // { // cur->pnext = pre;//修改指针,每次循环修改一次 // // pre = cur; // cur = next; // next = next->pnext; // }//循环终止时,next->pnext == NULL // cur->pnext = pre; // next->pnext = cur; // head = next; // return head; // //} void link_reverse(Node **headRef)//递归来实现链表逆序,相比上面注释的部分实现,显得相当简洁 { Node *first,*rest; if(*headRef == NULL) return; first = *headRef; rest = first->pnext; if(rest == NULL) return; link_reverse(&rest); first->pnext->pnext = first; first->pnext = NULL; *headRef = rest; } int main() { Node *new_head=NULL; Node *head = link_create(); link_show(head); //new_head = link_reverse(head); link_reverse(&head); link_show(new_head); link_destroy(new_head); //system("pause"); return 0; }原文链接:https://www.f2er.com/datastructure/383231.html