您的位置:首页 > 其它

单链表的反转

2016-05-02 21:12 281 查看
如何把一个单链表进行反转?

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

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

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

 方法1:浪费空间。

 方法2:使用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



 第三次循环。。。。。

 具体代码如下

 view
plain

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;  

    while(q){  

        r = q->next; //  

        q->next = p;      

        p = q; //  

        q = r; //  

    }  

    head=p;  

    return head;      

}  

 

 

方法3

还是先看图,



从图上观察,方法是:对于一条链表,从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,(N-1)次这样的操作结束之后将第1个节点挪到新表的表尾即可。

代码如下:

 

 view
plainActList* ReverseList3(ActList* head) 



    ActList* p; 

    ActList* 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;//新head变为原head的next 

    p->next->next=NULL;//断掉环 

    return head;   



相关链接:LeetCode

234. Palindrome Linked List

https://leetcode.com/problems/palindrome-linked-list/

原文链接:http://www.2cto.com/kf/201110/106607.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: