单链表反转

    xiaoxiao2022-07-07  193

    设置三个指针,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; }
    最新回复(0)