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

     假定一个单链表,其排列是这样的: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;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值