C语言实现链表的逆序的几种方式

通过头插法实现的

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值