前天笔试碰见的题,以前室友也问过我,然而我给出的答案是一直获取最后一个节点然后保存下来指向最后一个节点即可,还需要将题目给出的链表结构体添加一些函数才能实现,而且这种做法很蠢!!!所以今天我写一个按照原题的要求写,题目给的结构体为:
(经历这次面试,发现自己太爱钻牛角尖,和室友解答的时候只是随口说说想法装一下自己随便就能做出来的B,并没有去实践去确认,所以到我自己去做的时候发现会出现野指针算法效率低下,用很蠢很烂的方法去做,而不是静下心去分析问题)
struct mylist{
int val;
mylist* next;
};
问题的关键:从题中的链表结构体我们可以看出,我们要达到反转效果,就需要一个前驱指针给我们带路,然而这个链表无前驱指针,哪怎么办呢?我们自己做标记~
struct mylist {
int val;
mylist* next;
mylist(int m_val) :val(m_val),next(NULL) {}
};
void reverselist(mylist * &list)
{
mylist* list_size = list;
mylist* pre = NULL;
mylist* curr = list;
mylist* next = curr->next;
int size = 0;
while (list_size != NULL)//测试大小
{
size++;
list_size = list_size->next;
}
int i = size;
while (curr != NULL)//遍历到最后一个节点
{
if (pre == NULL)//第一个节点跳过
{
pre = curr;
curr = curr->next;
next = curr->next;
i--;
continue;
}
if (i == size - 1)//第一个节点的next置为NULL
{
curr->next = pre;
pre->next = NULL;
pre = curr;
curr = next;
next = next->next;
i--;
}
else
{
curr->next = pre;
pre = curr;
if (next == NULL)//如果我们的后继指针为空,则直接break循环,否则后面的语句执行会报错
break;
curr = next;
next = next->next;
i--;
}
}
list = curr;//改变指针指向反转后的第一个节点
}
int main()
{
mylist *a = new mylist(3);
mylist *b = new mylist(4);
mylist *c = new mylist(5);
mylist *d = new mylist(6);
a->next = b;
b->next = c;
c->next = d;
cout << "原链表" << a->val << " " << b->val << " " << c->val << " " << d->val<<endl;
reverselist(a);
cout << "反转后";
while (a != NULL)
{
mylist *temp=a;
cout << a->val << " ";
a = a->next;
delete temp;
temp=NULL;
}
return 0;
}
结果图: