腾讯之前 出过 一道面试题,要求 实现 单链表的反转
由于是单链表的原因,因此,思考方向只能从头部出发,
具体思路 如下:
比如 原来的链表 是这样的: 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