C语言:单链表的反转

  • 思路  

定义三个指针分别指向

当前结点(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;
    }

     

欢迎交流!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值