您的位置:首页 > 其它

单链表反转

2015-08-30 10:22 417 查看
单链表的翻转是一道很基本的算法题。

方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。

方法2:使用三个指针遍历单链表,逐个链接点进行反转。

方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

方法1的问题是浪费空间。方法2和方法3效率相当。一般方法2较为常用。

方法2代码:

[cpp] view
plaincopy

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的指针,所以必须先保留p2->next

p2->next=p1;

p1=p2; //循环往后

p2=p3;

}

head->next=NULL; //原先的head已经变成tail,别忘了置空,只有到这步才能置空

*head=p1;

return head;

}

方法3代码:

[cpp] view
plaincopy

Node* ReverseList(Node* head)

{

Node *p,*q;

p=head->next;

while(p->next!=NULL) //在这个循环过程中p所指的元素一直是不变的

{

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: