反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:头插法
代码思想:设单链表的头结点为A,两指针分别为p,r。
1.指针p指向头结点之后的第一个结点,指针r指向指针p的后继结点。
2.把指针p所指的结点插在头结点之后。
3.令指针p指向r
4.r指向r的后继结点
5.重复2,3,4步,直至r==NULL
6.此时只剩最后一个结点未插入,将p指向的结点插入头结点之后,完成
1 void Inverse(LNode *A) 2 { 3 LNode *p,*r; 4 p=A->next; //指针p指向头结点之后的第一个结点 5 r=p->next; //指针r指向指针p的后继结点 6 while(r!=NULL) //当r指向空,就不能继续执行循环了,否则r将指向空的后继,导致运行失败 7 { 8 p->next=A->next; //把指针p所指的结点插在头结点之后 9 A->next=p; 10 p=r; //令指针p指向r 11 r=r->next; //r指向r的后继结点 12 } 13 p->next=A->next; //将p指向的结点插入头结点之后 14 A->next=p; 15 }
方法二:三指针法
代码思想:设单链表的头结点为A,设三个指针分别为p,q,r。
1.令p指向空
2.q指向头结点之后的第一个结点
3.r指向q的后继结点,q的后继指针指向p
4.p指向q,q指向r(一定要让p先指向q, 否则q指向r之后,无法再找到p)
5.重复3.4步,直到r==NULL,完成
1 void Inverse(LNode *A) 2 { 3 LNode *p,q,r; 4 p=NULL; //令p指向空 5 q=A->next; //q指向头结点之后的第一个结点 6 while(r!=NULL) 7 { 8 r=q->next; //r指向q的后继结点 9 q->next=p; //q的后继指针指向p 10 p=q; //不断链的关键 11 q=r; 12 } 13 A->next=p; //p插入到头结点之后 14 }
原文:https://www.cnblogs.com/SmallCactus/p/12488870.html