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