设置三个指针,pHead头指针,prev一直指向初试状态的第一个元素(比如初始状态共1、2、3、4四个元素,在反转的过程中指针prev一直指向元素1),pcur指针指向每次反转的结点;每次将ocur指向的元素反转到头指针后面。
如上图示:将元素2反转到头指针和元素1之间
1、元素1直接指向元素3
2、元素为2的结点指向元素1
3、头指针指向元素2
4、pcur指针指向元素3(下一个将要反转的结点)
每次循环的终止条件是(pcur != NULL)
全部代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct NODE {
int data;
struct NODE *pNext;
}NODE, *PNODE;
PNODE creat_list(void);
void traverse_list(PNODE pHead);
void reverse(PNODE pHead);
/*主函数*/
int main(void) {
PNODE pHead = creat_list(); //PNODE == struct NODE *
reverse(pHead);
traverse_list(pHead);
return 0;
}
/*创建链表*/
PNODE creat_list(void) {
int len; //用来存放有效节点的个数
int i;
int val; //用来临时存放用户输入的结点的值,
/*分配一个不存放有效数据的头节点*/
PNODE pHead = (PNODE)malloc(sizeof(NODE)); //pHead指向头节点
if (NULL == pHead) //内存分配时必须判断是否成功
exit(-1);
PNODE pTail = pHead; //pTail也指向头节点
pTail->pNext = NULL; //先创建一个空链表
printf("输入链表元素个数:");
scanf("%d", &len);
for (i = 0; i < len; i++) {
scanf("%d", &val);
PNODE pNew = (PNODE)malloc(sizeof(NODE)); //pNew是新的结点
if (NULL == pNew)
exit(-1);
pNew->data = val; //给新结点赋数值域
pTail->pNext = pNew; //指向新节点
pNew->pNext = NULL; //给新结点赋指针域
pTail = pNew; //pTali时刻指向尾指针域
}
return pHead;
}
/*反转链表*/
void reverse(PNODE pHead) {
PNODE prev = pHead->pNext, pcur = prev->pNext;
while (pcur != NULL) {
prev->pNext = pcur->pNext;
pcur->pNext = pHead->pNext;
pHead->pNext = pcur;
pcur = prev->pNext;
}
}
/*遍历输出链表元素*/
void traverse_list(PNODE pHead) {
PNODE p = pHead->pNext; //p指向 头节点 后面的结点
while (p != NULL) {
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}