注明,本博客均假设链表没有单独的头结点。
网上博客:http://blog.csdn.net/niuer09/article/details/5961004 一种有有单独头结点的一种实现,带有头结点的实现起来要简单一些的。
单向链表的逆序或是反转是经常会遇到的一个面试题,也是一个非常基础的问题,我自己的面试中就已经遇到的两次。
比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1.
最容易想到的方法,其实也可说是最简单的办法就是遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。
分析:
1). 若链表为空,则直接返回;
2). 设置三个前后相邻的指针pre,粗人,next, 将pre所指向的节点作为cur指向节点的后继;
3). 重复2)直到cur为空
4). 调整链表头和链表尾
源代码如下:
void reverse(linka** head) {
if(head ==NULL || *head ==NULL)
return;
4: linka *phead = *head;
5: linka *pre=phead;
6: linka *cur=phead->next;
7: linka *next =NULL;
while(cur)
9: {
10: next = cur->next;
11: cur->next = pre;
12: pre = cur;
13: cur = next;
14: }
15: phead->next = NULL;
16: phead = pre;
17:
18: *head = phead;
19: }