一种简单的单链表逆序、反转的方法

来源:互联网 发布:厦门市公安局网络公章 编辑:程序博客网 时间:2024/05/18 03:27

     假定一个单链表,其排列是这样的:P1--->P2--->P3--->.................

     其中,P1就是头结点。

     反转思路是:

    (1)第一步反转,P1和P2, 也就是使得P2->next=P1. 如图: P1<----p2--->P3

     (2)第二步,采用同样的方式,反转P3和P2,也就是使得;P1<---P2<---P3

         既然是同第一步一样的方式,就不能简单地P3-->Next=P2完事了,否者的话得穷举所有结点,一相邻两个结点为单位,挨个手工反转了。

        于是想到利用指针的特性,重用第一步的反转。这个时候只要使得P1指向P2,P2指向P3,再重用第一步反转P1和P2,即P2->next=P1.。相当于从P1开始整体指针往右移动,这样P2和P3之间的反转由于指针重新赋值了,变成了可以直接重用P1和P2的反转了。

算法实现如下:(leetcode代码,通过调试)

class Solution {
public:
    ListNode* reverseList(ListNode* head)
    {
        if ((NULL==head) || (NULL==head->next) ) return head; 
       
        ListNode* P1 = head;
        ListNode* P2 = P1->next;
        P1->next=NULL;
       
        while ( NULL!=P2 )
        {
            ListNode* tmp=P2->next;
            P2->next=P1;
            P1=P2;
            P2=tmp;
        }
       
        return P1;
    }
};



0 0
原创粉丝点击