如何把一个单链表进行反转?
方法1:使用3个指针遍历单链表,逐个链接点进行反转。
方法2:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
方法3: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递归。可以认为单链表是一颗永远只有左(右)子树的树,因此可以考虑用递归来解决。或者说,因为单链表本身的结构也有自相似的特点,所以可以考虑用递归来解决)
方法1:
使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。
p = head;
q = head->next;
head->next = NULL;
现在进入循环体,这是第一次循环。
r = q->next;
q->next = p;
p = q;
q =r;
第二次循环。
r = q->next
q->next = p;
p = q;
q = r
第三次循环。。。。。
代码:
- ActList* ReverseList2(ActList* head)
- {
- //ActList* temp=new ActList;
- if(NULL==head|| NULL==head->next) return head; //少于两个节点没有反转的必要。
- ActList* p;
- ActList* q;
- ActList* r;
- p = head;
- q = head->next;
- head->next = NULL; //旧的头指针是新的尾指针,next需要指向NULL
- while(q){
- r = q->next; //先保留下一个step要处理的指针
- q->next = p; //然后p q交替工作进行反向
- p = q;
- q = r;
- }
- head=p; // 最后q必然指向NULL,所以返回了p作为新的头指针
- return head;
- }