通过头插法实现的
1、通过头插法(两条链表)
来实现的。通过遍历原来的链表,将遍历得到的每一个节点都插入到新链表的头结点,然后遍历新链表,得到的就是链表的逆序了。
实现链表逆序的代码:
过程分析:
看到上面的过程,有些伙伴可能会疑问,为什么每一次遍历的时候,都需要给Node重新分配空间呢?再进行循环之前,给Node分配一次空间不就好了?一开始我也是这样想的,但是运行的结果却是只有一个值,并且陷入了死循环
.
请看下面的过程分析:
//将节点插入到头结点,从而实现逆序
Node * insertTop(Node *head,Node *root){
Node *temp,*node;//node表示新节点
temp = head;
//将遍历得到的节点插入到root链表的头结点,从而实现逆序
while(temp != NULL){
/*
给新结点分配空间,这一步十分重要的,如果没有重新给node分配空间,那么根据下面的代码,
得到的就是root==node,即root和Node都指向同一个地址,进行后面的操作时就会形成一个环
*/
node = (Node *)malloc(sizeof(Node));
node->number = temp->number;
node -> next = NULL;
/*
if(root == NULL){
//如果是空链表,那么新节点就是头结点
root = node;
printf("由于链表是空的,那么新节点就是头结点\n");
}else{
//如果不是空链表,那么原来的头结点就在新节点的后面,新节点就是头结点
node->next = root;
root = node;
Node *t = root->next;
printf("新头结点的值为%d,原来头结点的值为%d\n",root->number,t->number);
}
*/
/*
上面的代码可以用下面两行代码代替,因为只需要将当前这个新节点作为头结点,这个新节点后面时原
来头结点的下一个节点即可,而不用再判断root是否为空了
*/
node->next = root;
root = node;
temp = temp->next;
}
return root;
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE{
int number;
struct NODE *next;
}Node;
Node * insert(int number, Node *root);//函数声明,使得这个函数可以定义在main函数的后面
void display(Node *root);
Node * insertTop(Node *head,Node *root);
int main(){
Node *a,*b;//a表示原来的链表,b表示逆序的链表
a = b = NULL;//初始化链表(空表)
//创建链表
int i,number;
for(i = 0; i < 5; i++){
printf("输入第 %d 个节点的值:",i + 1);
scanf("%d",&number);
a = insert(number,a);//将新节点插入到链表最后
}
display(a);
b = insertTop(a,b);
printf("链表a的逆序链表:\n");
display(b);
return 0;
}
//将新节点插入在链表的最后
Node * insert(int number,Node *root){
Node *current,*node;//node表示新节点
node = (Node *)malloc(sizeof(Node));//给新结点分配空间
node->number = number;
node->next = NULL;
current = root;
if(current == NULL){
//如果是空表,那么新节点就是根节点
root = node;
}else{
//否则,将遍历到链表的最后,将新节点插入在链表尾
while(current -> next != NULL){
//如果不是最后一个节点,继续遍历
current = current -> next;
}
current -> next = node;
}
return root;
}
//将节点插入到头结点,从而实现逆序
Node * insertTop(Node *head,Node *root){
Node *temp,*node;//node表示新节点
temp = head;
//将遍历得到的节点插入到root链表的头结点,从而实现逆序
while(temp != NULL){
//给新结点分配空间,这一步十分重要的,如果没有重新给node分配空间,那么根据下面的代码,得到的就是root==node
node = (Node *)malloc(sizeof(Node))