单链表的反转(腾讯面试题)

这篇博客介绍了如何解决腾讯面试中的一道题目,即如何反转单链表。通过创建新头结点B,逐步将原链表A的元素反向连接,详细阐述了反转过程,并提供了具体的步骤和示例输入输出,帮助理解单链表反转的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

腾讯之前 出过 一道面试题,要求 实现 单链表的反转
由于是单链表的原因,因此,思考方向只能从头部出发,
具体思路 如下:
比如 原来的链表 是这样的: A —>a---->b----c;
然后我们创建一个新的 头部结点B;
然后
B---->a
B----->b------>a
B----->c------>b------>a
然后 就实现了 单链表的反转了

#include<stdlib.h>
#include<stdio.h>
struct node
{
	int value ;
	node * next;	
 } ;

 node * create(void)
 { node *head;
   
  node *p1, *p2;
  p1=p2 = (node *)malloc(sizeof (node))	;
  scanf("%d",&p1->value);
  head=p1;
  while(p1->value!=-1)
  {  
    p2=p1;
    p1=(node * )malloc(sizeof(node));
	scanf("%d",&p1->value);
 		p2->next=p1;
  }
  p2->next=NULL;
  return head;
 }
 
 	void print1(node * head)
 	{
 		node * p;
 		p=head;
 	  if (head!=NULL)
	   {
	   while(p!=NULL)
	   {
	   		printf("%d\t",p->value);
	   		p=p->next;
		  }
		   
		 }	
		   
	 }
node * reverse(node * A)
	 {
	 	 node * cur;
	 	 node *next;
	 	node *B;
	B = (node * ) malloc(sizeof (node));
		cur = (node * ) malloc(sizeof (node));
			next = (node * ) malloc(sizeof (node));//不能够连等哦 ,不然会 地址相同呢
		cur = A;
		B->next=NULL;//这行代码 。。。没有的话…吐了  print1那里 一直 给我报错  
	 	while (cur!=NULL)
	 	{ next = cur->next;//NEXT是第二个数值的地址//例如我输入的是 1 2 3 4 -1
		  cur->next=B->next;//这行代码 很重要 ,没有的话 反转不了 单链表… 
		  //第一遍的时候 让 第一个 数值 的 next 指向Null  
		  //第二遍的时候让 下一个数值 指向 第一个 
		  
	 	 B->next=cur; //第二遍的时候 ,这里 cur为 2 然后 2 就和B 接上了 
	 	 cur=next;// 以此类推 如果 看不懂的话 看我下面 讲解例子
		 }

		 return B->next; //因为读取的时候是 从头结点开始读的,B 是没有值 的,Bnext才是第一个
		 
	 }
	 int main()
		{
			node *p;
			p=create();
			print1(p);
			p=reverse(p);
			print1(p);
			return 0;
		 } 
 

例子 :
输入 1 2 3 4 -1;
B->next=NULL;
while (cur!=NULL)
{ next = cur->next;
cur->next=B->next;
B->next=cur;
cur=next;
}

一开始B->next 指向NULL,cur 是1 ,cur ->next 指向2 的地址,next 是2 的地址
cur->next=B->next; 第一次的时候 ,就会 指向NULL了
然后 因为后面 B->next=cur; B->next 就 指向1的地址了对吧~ 记住哦 不是NULL了 呢
然后 第二遍的时候
因为 CUR=NEXT 所以 cur指向2的那个地址咯 , next就是 3
此时cur->next=B->next; 就 是 2的next 指向1 ~ 不是NULL了哦
然后 利用 B->next=cur; 和 cur=next; 反复 将后一个元素 甩到前面 甩到没为止 (终止条件 是next=NULL 因为刚开始的时候最后一个元素的next 就是 NULL)
运行结果如图:
在这里插入图片描述
2020年6月15日 02:32:18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是牛大春呀

老板糊涂啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值