将单链表逆置*
有一个不带头结点的单链表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);
}


浙公网安备 33010602011771号