欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法--单链表逆序

程序员文章站 2022-04-25 17:41:39
...

算法--单链表逆序

单链表逆序

思路

算法--单链表逆序

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;
}
相关标签: Record