单链表的翻转
单链表的翻转是一道很基本的算法题。
方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。
方法2:使用三个指针遍历单链表,逐个链接点进行反转。
方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
方法1的问题是浪费空间。方法2和方法3效率相当。一般方法2较为常用。
方法2代码:
1 Node * ReverseList(Node *head) 2 { 3 Node *p1,*p2,*p3; 4 if(head==NULL||*head==NULL) 5 return head; 6 p1=head; 7 p2=p1->next; 8 while(p2) //注意条件 9 { 10 p3=p2->next; //要改变p2->next的指针,所以必须先保留p2->next 11 p2->next=p1; 12 p1=p2; //循环往后 13 p2=p3; 14 } 15 head->next=NULL; //原先的head已经变成tail,别忘了置空,只有到这步才能置空 16 *head=p1; 17 return head; 18 }
方法3代码:
1 Node* ReverseList(Node* head) 2 { 3 Node *p,*q; 4 p=head->next; 5 while(p->next!=NULL) //在这个循环过程中p所指的元素一直是不变的 6 { 7 q=p->next; 8 p->next=q->next; 9 q->next=head->next; 10 head->next=q; 11 } 12 p->next=head; //相当于成环 13 head=p->next->next; //新head变为原head的next 14 p->next->next=NULL; //断掉环 15 return head; 16 }