注明,本博客均假设链表没有单独的头结点。

网上博客: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: }

相关文章: