单链表的翻转

单链表的翻转

方法一:

先看下面的图,我先定义三个结构体指针 n1是NULL,n2指向头部,n3是n2->next。
这时我们先让n2指向n1。
再让n1和n2和n3分分别向下走。
走完之后再让n2指向n1,就这样循环下去。
在这里插入图片描述注意一下到最后是n2和n3都是NULL(我们上面写的是他们三个都要往下走,当n3是NULL时n2不是NULL,就还要往下走,但是NULL不能往下走所以我们要来个判断):在这里插入图片描述说完了之后,我们看代码吧!

void ReverseList1(SL **phead)
{
	SL *n1=NULL;
	SL *n2=*phead;
	SL *n3=n2->next;
	if(*phead==NULL)
	{
		return;
	}
	while(n2!=NULL)                         
	{
		n2->next=n1;                      //翻转    
		
		n1=n2;                            //迭代往下走
		n2=n3;
		if(n3!=NULL)                      //这个就是我在括号里面写的注意
		{
			n3=n3->next;
		}
	}
	*phead=n1;                            //n1跑到末尾,把头给它
}

这个是反转的核心代码,创建的话我觉得聪明的你肯定能搞定。

方法二:

这种方法是头插:
我们先看代码

void ReverseList2(SL **phead)
{
	SL *cur=*phead;
	SL *newhead=NULL;
	while(cur)
	{
		SL *next=cur->next;    
		//头插           
		cur->next=newhead;                 
		newhead=cur;    //代表让newnode跟着cur走,在它的后面。
		
		//迭代往后走
		cur=next;
	}
	*phead=newhead;
}

这个代码其实很简单,就是一步一步让它往后指。
这两个都是核心的代码,希望可以帮到你。

我整体代码你可以看一下:

#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
	int a;
	struct list *next;	
}SL;
void CreateList(SL **phead)
{
	printf("输入要创建的节点个数:\n");
	int num;
	scanf("%d",&num);
	int i=1;
	while(num>0)
	{
		SL *newnode=(SL *)malloc(sizeof(SL));
		int data;
		printf("请输入第%d个节点的数据:\n",i);
		scanf("%d",&data);
		newnode->a=data;
		if(*phead==NULL)
		{
			*phead=newnode;
			newnode->next=NULL;
		}
		else 
		{
			SL *p=*phead;
			while(p->next!=NULL)
			{
				p=p->next;
			}
			p->next=newnode;
			newnode->next=NULL;
		}
		num--;
		i++;
	}
}
void ReverseList1(SL **phead)
{
	SL *n1=NULL;
	SL *n2=*phead;
	SL *n3=n2->next;
	if(*phead==NULL)
	{
		return;
	}
	while(n2!=NULL)                         
	{
		n2->next=n1;                      //翻转    
		
		n1=n2;                            //迭代往下走
		n2=n3;
		if(n3!=NULL)                      
		{
			n3=n3->next;
		}
	}
	*phead=n1;                            //n1跑到末尾,把头给它
}
void ReverseList2(SL **phead)
{
	SL *cur=*phead;
	SL *newhead=NULL;
	while(cur)
	{
		SL *next=cur->next;    
		//头插           
		cur->next=newhead;                 
		newhead=cur; 
		
		//迭代往后走
		cur=next;
	}
	*phead=newhead;
}
int ListLength(SL *phead)
{
	SL *p=phead;
	int i=0;
	while(p!=NULL)
	{
		p=p->next;
		i++;
	}
	return i;
}
void PrintList(SL *phead)
{
	SL *p=phead;
	while(p!=NULL)
	{
		printf("%d ",p->a);
		p=p->next;
	}
}
void test1()
{
	SL *list=NULL;
	CreateList(&list);
}
int main()
{
	test1();
	return 0;
}

``
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值