单链表的反转问题是一道很基本的问题。题目如下: 
有一个单链表 1 ->2->3->4->5->6 反转后链表为:6->5->4->3->2->1.
解析:可以使用三个指针pre ,temp,next对逐个节点进行反转。详细流程如下: 
(4) 初始状态
pre = head;
tmp = head->next;
pre->next = null;
(2)第一次循环:
next = tmp->next;
tmp->next = pre;
pre 和 tmp 后移一位 , 第一次循环结束,第一个节点指向了头节点。
pre = tmp;
tmp = next;
(3) 第二次循环
next = tmp->next;
tmp->next = pre;
pre = tmp;
tmp = next;
(4)如此循环下去,直到最后一个节点被反转。
具体代码如下:
LinkList reverseLinkList(LinkList head){
if(head == NULL || head->next == NULL)
    return head;
//创建三个辅助指针pre,tmp,next
LinkList pre,tmp,next;
//初始化 pre , tmp
pre = head;
tmp = head->next;
pre->next =NULL;
//开始遍历
while(tmp != NULL){
    next = tmp->next;
    tmp->next = pre;
    pre = tmp;
    tmp = next;
}
head = pre;
return head;
}
解析:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。 
(1)初始状态
p = head->next;
(2)开始循环。第一次循环将节点3插入到节点1后面(代码中的步骤分别对应下图中的步骤)
while(p->next){
  q = p->next;
  (1) p->next =q->next;
  (2) q->next = head->next;
  (3) head->next = q;
}
(3)将第一个节点加到链表尾部
    (1)p->next=head;//相当于成环 
    (2)head=p->next->next;//新head变为原head的next 
        p->next->next=NULL;//断掉环 
具体代码如下:
LinkList reverseLinkList(LinkList head){
if(head == NULL || head->next == NULL)
    return head;
LinkList p,q;
p = head->next;
//开始遍历
while(p->next){
  q = p->next;
  p->next =q->next;
  q->next = head->next;
  head->next = q;
}
  p->next=head;//相当于成环 
    head=p->next->next;//新head变为原head的next 
    p->next->next=NULL;//断掉环 
    return head;   
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/a253664942/article/details/49187795