链表反转
typedef关键字
链表反转中,为了是代码简介这里用到了typedef关键字,先介绍下typedef关键字。
作用是为一种数据类型定义一个新名字,
这里的数据类型包括内部数据类型(int char 等)和自定义的数据类型(struct等)。
和struct来匹配,为了代码编写简介。
和普通类型匹配,通过名字来获取一些信息。
struct Student{
int data;
char *name;
};
上面这种写法,再用的时候需要:struct Student stu1;
这样写
typedef struct Student{
int data;
char *name;
}STU;
但是这种写法,就相当于用STU来代替struct Student,我们在用的时候就可以直接写成 STU stu1;
有时候也会这样写
typedef struct Student{
int data;
char *name;
}*pSTU;
用的时候:
pSTU pstu;
pstu->data = 99;
创建链表
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}NODE; //上文介绍了typedef的用法,可以看看
NODE *creatLink(int n)
{
NODE *head; //创建头节点
NODE *node; //创建普通节点
NODE *end; //创建尾节点
head = (NODE *)malloc(sizeof(NODE)); //给头节点申请内存
end = head; //将head的地址赋给end
for(int i=1;i<=n;i++){
node = (NODE *)malloc(sizeof(NODE)); //给输入的节点开辟空间
printf("请输入第%d个数据: ",i);
scanf("%d",&(node->data)); //获取数据到新节点的data里
end->next = node; //end的下一个是新节点
end = node; //新节点变为end
}
end->next =NULL; //给end的指针域置空
return head; //返回头节点的地址
}
void printLink(NODE *head)
{
NODE *point = (NODE *)malloc(sizeof(NODE));
point = head->next; //因为头节点没有赋值,输入的第一个值赋给了head的下一个
while(point != NULL){
printf("%d ",point->data);
point = point->next;
}
putchar('\n');
}
int main()
{
int n;
NODE *head = NULL;
printf("请输入要创建的结点个数: ");
scanf("%d",&n);
head = creatLink(n);
printLink(head);
return 0;
}
反转链表
struct ListNode* ReverseList(struct ListNode* pHead ) {
struct ListNode *pre = NULL; //前面
struct ListNode *cur = pHead;//当前
struct ListNode *tmp = NULL;//临时,用来存放数据
while(cur){
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}