- 思路
定义三个指针分别指向
当前结点(pte)、下一个结点(pnext)、上一个结点(pre)
从头结点开始遍历、每个循环内的四步为
1.将pnext指向下一个结点(pnext=pte->next)
2.改变当前结点的指针域(pte->next=pre)
3.将pre指向当前结点(pre=pte)
4.当前结点后移、使pte指向下一个结点(pte=pnext)
循环结束后将pte->next=pre以连接上最后一个结点
- PS
需要注意的是链表创建完的输出函数(list1)和反转后的输出函数(list2)不一样
list1跳过头结点输出
list2相当于跳过尾结点输出
- 代码展示(编译环境VS2017)
#include<stdio.h> struct node { int data; struct node*next; }; struct node * create(struct node *p) { int x,n,i; struct node *ph=p, *pte,*pta=p; printf("请输入结点个数:\n"); scanf("%d", &n); printf("请输入结点:\n"); for(i=0;i<n;i++) { scanf("%d", &x); pte = (struct node *)malloc(sizeof(struct node)); pte->next = NULL; pte->data = x; pta->next = pte; pta = pte; } return ph; } void list1(struct node *p) { p = p->next; while (p) { printf("%d ", p->data); p = p->next; } } void list2(struct node *p) { while (p->next) { printf("%d ", p->data); p = p->next; } } struct node * reverse(struct node *p) { struct node *pte=p, *pnext=NULL, *pre=NULL; while (pte->next) { pnext = pte->next; pte->next = pre; pre = pte; pte = pnext; } pte->next = pre; return pte; } int main() { struct node *ph; ph = (struct node *) malloc(sizeof(struct node)); ph->next = NULL; ph = create(ph); printf("输出\n"); list1(ph); ph = reverse(ph); printf("\n反转\n"); list2(ph); getchar();getchar(); return 0; }
欢迎交流!