c/c++笔试题及分析目大全单向链表的反转是一种常常被问到的一种面试题,也是一种非常基础的问题
例如一种链表是这样的:1->2->3->4->5通过反转后成为5->4->3->2->1
最轻易想到的措施遍历一遍链表,运用一种辅助指针,存储遍历过程中目前指针指向的下一种元素,然后将目前节点元素的指针反转后,运用已经存储的指针往背面继续遍历
源代码如下:1
structlinka{2
intdata;3
linka*next;4
voidreverse(linka*&head){6
if(headnull)7
return;8
linka*pre,*cur,*ne;9
pre=head;10
cur=head->next;11
while(cur)12
ne=cur->next;14
cur->next=pre;15
pre=cur;16
cur=ne;17
head->next=null;19
head=pre;20
}尚有一种运用递归的措施
这种措施的基本思想是在反转目前节点之前先调用递归函数反转后续节点
不过这个措施有一种缺陷,就是在反转后的最终一种结点会形成一种环,因此必须将函数的返回的节点的next域置为null
由于要变化head指针,因此我用了引用
算法的源代码如下:1
linka*reverse(linka*p,linka*&head)2
if(pnull||p->nextnull)4
head=p;6
returnp;7
linka*tmp=reverse(p->next,head);11
tmp->next=p;12
returnp;13
}②已知string类定义如下:classstring{public:string(constchar*str=null);//通用构造函数