将单链表逆置*
有一个不带头结点的单链表L(至少有1个结点),
第一个结点指针为head,编写算法将L逆置,
即最后一个结点变成第一个结点,倒数第二个结点变成第二个结点,如此等等。
#include<stdio.h> #include<stdlib.h> //链表中节点的结构 typedef struct Link { int data; struct Link* next; }link; //链表初始化 link* initByTailInsert(link* phead) { link* first_node = (link*)malloc(sizeof(link));//创建第一个节点 //第一个结点先初始化 first_node->data = 1; first_node->next = NULL; phead = first_node;//头指针指向第一个节点 //尾插入赋值 for (int i = 2; i < 10; i++) { link* new_node = (link*)malloc(sizeof(link)); //申请新的结点 new_node->data = i; new_node->next = NULL; first_node->next = new_node; //第一个结点的指针域指向这个新申请的结点 first_node = new_node; //第一个结点后移 } //printf("头指针指向的值是:%d\n", phead->data);//1 return phead; //将指向第一个结点的头指针返回 } link* reverseLink(link* phead){ link* p = NULL; link* q = phead; //q指向当前被改变指针域的结点 while (q != NULL) { phead = phead->next; q->next = p; p = q; q = phead; } phead = p; return phead; } void showLink(link* phead) { link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针 //只要tmp指针指向的结点的next不是Null,就执行输出语句。 while (tmp != NULL) { printf("%d ", tmp->data); tmp = tmp->next; } printf("\n"); } void main() { link* myhead = NULL; myhead = initByTailInsert(myhead);//创建头指针,得到经过初始化后的头指针 printf("初始化链表为:\n"); showLink(myhead); printf("将单链表逆置后:\n"); myhead = reverseLink(myhead); showLink(myhead); }