单链表的翻转是一道很基本的算法题。
方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。
方法2:使用三个指针遍历单链表,逐个链接点进行反转。
方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
方法1的问题是浪费空间。方法2和方法3效率相当。一般方法2较为常用。
方法2代码:
- Node * ReverseList(Node *head)
- {
- Node *p1,*p2,*p3;
- if(head==NULL||*head==NULL)
- return head;
- p1=head;
- p2=p1->next;
- while(p2)
- {
- p3=p2->next;
- p2->next=p1;
- p1=p2;
- p2=p3;
- }
- head->next=NULL;
- *head=p1;
- return head;
- }
方法3代码:
- Node* ReverseList(Node* head)
- {
- Node *p,*q;
- p=head->next;
- while(p->next!=NULL)
- {
- q=p->next;
- p->next=q->next;
- q->next=head->next;
- head->next=q;
- }
- p->next=head;
- head=p->next->next;
- p->next->next=NULL;
- return head;
- }