算法--单链表逆序

算法--单链表逆序

单链表逆序

思路

在这里插入图片描述

code

//单链表逆序
//注意:head->next才是头结点,而不是head!head只是指向头结点的指针
//因为头指针与头结点不同,头结点即第一个结点,头指针是指向第一个结点的指针。
//链表中可以没有头结点,但不能没有头指针
#if 1
#include <stdio.h>

typedef struct node {
  int data;
  struct node *next;
} linkList;

//初始化带头节点的单链表
linkList *creatLinkList(void) {
  linkList *head =
      (linkList *)malloc(sizeof(linkList));  //创建新节点并申请堆内存
  head->data = 0;                            //初始化头节点值为0
  head->next = NULL;                         //头结点的指针域指向空
  return head;
}

void insertNode(linkList *current, int n) {
  int i;
  linkList *newNode = NULL;
  for (i = 1; i <= n; i++) {
    newNode = (linkList *)malloc(sizeof(linkList));
    if (current == NULL || newNode == NULL) {
      return;
    }
    newNode->data = i;
    newNode->next = NULL;
    current->next = newNode;
    current = newNode;
  }
}

void inverseLink(linkList *head) {
#if 1
  linkList *p, *q;
  p = head->next;     //记录第一个节点地址
  head->next = NULL;  //把链表设置成空表
  //一次按头插法将各个节点插入,实现逆置
  while (p != NULL) {
    q = p;                 //用q备份待插入节点地址
    p = p->next;           //将p变更为待插入节点的后继节点
    q->next = head->next;  //将q(待插入节点)插入到头节点的前面
    head->next = q;        //将新插入节点作为新的头节点
  }
#else
  linkList *temp = NULL;
  linkList *p, *q;
  if (head == NULL) {
    return;
  }
  p = head->next;
  q = head->next->next;
  if (p == NULL || q == NULL) {
    return;
  }
  while (q != NULL) {
    temp = q->next;
    q->next = p;
    p = q;
    q = temp;
  }
  head->next->next = NULL;
  head->next = p;
#endif
}

void printLinkList(linkList *head) {
  linkList *p = head->next;
  while (p != NULL) {
    printf("%d -> ", p->data);
    p = p->next;
  }
  printf("\r\n");
}

int main() {
  int i;
  linkList *head = NULL;
  head = creatLinkList();
  insertNode(head, 10);
  printf("原始链表:\r\n");
  printLinkList(head);
  inverseLink(head);
  printf("逆序后链表:\r\n");
  printLinkList(head);
  scanf("%d", &i);
  return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值